.net 异常处理困境

.net 异常处理困境,.net,exception-handling,debugging,.net,Exception Handling,Debugging,在处理现有代码时,我最近发现smt如下: if(Config.ExceptionBehavior.DEBUG_EXCEPTIONS) { foo.Foo(); } else { try { foo.Foo(); } catch(Exception ex) { //whatever } } 我正在摆脱这种情况,但我确实看到了这种代码的驱动程序中的一些价值:基本上,写这篇文章的人希望这件事在调试过程中崩溃。同时,这闻起来很难闻,因为

在处理现有代码时,我最近发现smt如下:

if(Config.ExceptionBehavior.DEBUG_EXCEPTIONS)
{
   foo.Foo();
}
else
{
   try
   {
      foo.Foo();
   }
   catch(Exception ex)
   {
      //whatever
   }
}
我正在摆脱这种情况,但我确实看到了这种代码的驱动程序中的一些价值:基本上,写这篇文章的人希望这件事在调试过程中崩溃。同时,这闻起来很难闻,因为你随意复制你的代码,这使得一切都非常混乱和杂乱无章

有没有什么正当的理由可以在不厚颜无耻地乱扔代码的情况下获得类似的行为

我能想到的唯一替代方法是一堆
#if DEBUG
等,但我想知道是否有任何应用程序范围的异常处理库可以提供类似的功能


感谢任何指点

如果此行的目的是确保程序停止在引发异常的行上,即使稍后捕获该异常,也可以将Visual Studio配置为执行此操作,而不更改代码

这是怎么做的

  • 转到调试->异常
  • 在“抛出”列中为“公共语言运行时异常”设置一个复选框
  • 或者,如果您希望更好地控制哪些异常停止,请不要将复选框置于“公共语言运行时异常”上,而是展开该节点,并选中那些要停止的异常

  • 诚然,无法控制此设置用于哪个源代码文件、名称空间、项目或诸如此类的内容,因此,如果相关代码正在引发“异常”或其他可能引发多次的异常类型,则您无法使用此解决方案,或者。。。您可以更改该代码。

    您可以使用
    操作
    (和
    谓词
    )类实现相同的功能


    还有一些通用版本允许您从
    TryIt
    方法返回数据。如果您需要指向该方向的指针,请告诉我。

    我也有同样的问题,我认为唯一可靠的方法是在应用程序的最顶层(如UI层)设置预处理器指令

    ASP.NET Web部件中的示例:

       protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
    
            try
            {
                DoSomethingDangerous();
            }
            #if !DEBUG
            catch (Exception ex)
            {
                Utilities.HandleException(ex); // does logging & shows a pretty error msg
            }
            #endif
            finally
            {
            }
        }
    

    嗯,您可以将Visual Studio配置为中断异常,即使是您要处理的异常,所以我一点也不明白这段代码的意义。我知道这肯定是件小事——写下一个答案,告诉我怎么做,你会得到一些甜蜜的代表点:)我想知道这段代码是否抛出了如此多的异常,以至于最初的程序员这样做是为了避免调试器如此频繁地中断?我以前见过那种味道!:-(这对我来说没有任何意义,而且很不寻常,它完全让我忘记了我可以从Debug->exceptions配置它AOP方法在注入行为方面很好,但它没有解决复制语句的问题(仍然有action.Invoke两次)?我和写代码的人谈过-基本上他说他把这样的东西放在适当的位置,因为他不想让VS在任何异常上停止(正如你所建议的)。一定有更好的方法来解决这个问题!
       protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
    
            try
            {
                DoSomethingDangerous();
            }
            #if !DEBUG
            catch (Exception ex)
            {
                Utilities.HandleException(ex); // does logging & shows a pretty error msg
            }
            #endif
            finally
            {
            }
        }