【问题标题】:Exception Handling Dilemma异常处理困境
【发布时间】:2010-01-12 12:44:36
【问题描述】:

处理现有代码,我最近发现 smt 是这样的:

if(Config.ExceptionBehavior.DEBUG_EXCEPTIONS)
{
   foo.Foo();
}
else
{
   try
   {
      foo.Foo();
   }
   catch(Exception ex)
   {
      //whatever
   }
}

我正在摆脱这个 - 但我确实在这种代码的驱动程序中看到了一些价值:基本上,写这个的人希望事情在发生异常的线路上崩溃,以进行调试。同时,这很难闻,因为您在任意复制代码,这使得一切都变得非常混乱和乱七八糟。

在不无耻地乱扔代码的情况下获得类似行为有什么体面的原因吗?

我能想到的唯一选择是一堆#if DEBUG 等,但想知道是否有任何应用程序范围的异常处理库可以给我这样的东西。

任何指针表示赞赏!

【问题讨论】:

  • 嗯,您可以将 Visual Studio 配置为中断异常,即使是您要处理的异常,所以我根本看不出这段代码的意义。
  • 我知道这一定是微不足道的事情 - 写下一个答案告诉我如何,你会得到一些甜蜜的代表点 :)
  • 我想知道这段代码是否抛出了如此多的异常,以至于原始编码器这样做是为了避免调试器经常中断?我以前见过那种味道! :-(
  • 这对我来说没有任何意义,而且它完全让我忘记了我可以从 Debug -> Exceptions 配置它是不寻常的

标签: .net exception-handling debugging


【解决方案1】:

如果这一行的目的是确保你的程序在抛出异常的那一行停止,甚至如果你稍后捕获该异常,你可以配置 Visual Studio 来做到这一点,无需更改您的代码。

方法如下。

  1. 转到调试->异常
  2. 在“Common Language Runtime Exceptions”的“Thrown”列中放置一个复选框
  3. 或者,如果您想更好地控制要停止的异常,请不要将复选框放在“公共语言运行时异常”上,而是展开该节点,然后选中您要停止的那些。

当然,无法控制此设置适用于哪个源代码文件、命名空间、项目或诸如此类的东西,因此,如果有问题的代码抛出“异常”或其他可能会被大量抛出的异常类型,那么您不能使用此解决方案,或者...您可以更改该代码。

【讨论】:

  • 我与编写该代码的人交谈过 - 基本上他说他放置了这样的东西,因为他不希望 VS 停止任何异常(如你所建议的那样)。一定有更好的方法来解决这个问题!
【解决方案2】:

您可以使用Action(和Predicate)类实现同样的目的。

public void TryIt(Action action){
    if(Config.ExceptionBehavior.DEBUG_EXCEPTIONS){
        action.Invoke();
    }else{
        try{
            action.Invoke();
        }catch{
            //whatever
        }
    }
}

public void MyMethod(string s){
   //Do something
}

public void MyOtherMethod(){
   //Do something entirely different
}

//Somewhere else in code:
TryIt(() => MyMethod("somestring"));
TryIt(MyOtherMethod);

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

【讨论】:

  • AOP 方法在注入行为方面很好,但它不能解决复制语句的问题(仍然有 action.Invoke 两次)?
【解决方案3】:

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

ASP.NET webpart 中的示例:

   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
        {
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2022-01-07
    • 1970-01-01
    相关资源
    最近更新 更多