异常处理困境

时间:2010-01-12 12:44:37

标签: .net exception-handling debugging

使用现有代码,我最近发现这样的smt:

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

我正在摆脱这个 - 但我确实看到了这种代码的驱动程序中的一些价值:基本上写这个的人希望事情在线上崩溃,出现调试目的的异常。与此同时,这种气味非常糟糕,因为你正在任意复制代码,这使得一切都变得混乱和乱七八糟。

是否有任何体面的原因可以获得类似的行为而不会无耻地乱扔你的代码?

我能想到的唯一选择是一堆#if DEBUG等等,但想知道是否有任何app广泛的异常处理lib可以给我这样的东西。

任何指针都赞赏!

3 个答案:

答案 0 :(得分:2)

如果要确保程序在抛出异常的行上停止,甚至,如果稍后再捕获该异常,则可以配置Visual Studio来执行此操作,没有更改您的代码。

这是怎么做的。

  1. 转到Debug-> Exceptions
  2. 在“公共语言运行时例外”的“Thrown”列中放置一个复选框
  3. 或者,如果您希望更好地控制要停止的例外,请不要将复选框放在“公共语言运行时例外”上,而是展开该节点,然后检查要停止的那些。
  4. 当然,没有办法控制这个设置所针对的源代码文件,命名空间,项目或者诸如此类的东西,所以如果有问题的代码抛出“Exception”或者可能会被抛出很多的其他异常类型,那么您无法使用此解决方案,或者......您可以更改该代码。

答案 1 :(得分:0)

您可以使用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方法返回数据。如果你需要指导那个方向,请告诉我。

答案 2 :(得分:0)

我遇到同样的问题,我认为唯一可靠的方法是在应用程序的最顶层(例如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
        {
        }
    }