尝试最后或尝试抓住最后

时间:2011-04-21 12:30:34

标签: c# exception-handling

如果我有类似下面的方法,我可以在这里省略catch块以获得相同的结果吗?:

private ClassInstance GetMeANumber()
{
     Resource a = null;

      try
      {
          Resource a = new Resource();
          return a.GetClassInstance();
      }
      catch
      {
          throw;
      }
      finally
      {
          if(a != null)
              a.Dispose();
      }
}

3 个答案:

答案 0 :(得分:18)

是的,那将是完全相同的。

但是,更常见的模式是在Resource上实施IDisposable。然后你可以使用using来更简洁地实现同样的事情。

using (Resource a = new Resource()) {
    return a.GetClassInstance();
}

答案 1 :(得分:2)

“简单的重新抛出”捕获块将产生一些影响,您可能会或可能不会喜欢:

  1. 如果堆栈跟踪包含行号,则与捕获和重新呈现的例程关联的行号将是重新呈现的行号,而不是发生异常的方法调用的行号。在某些情况下,这可能非常烦人。
  2. 所有隐式或显式嵌套“finally”块将在第一遍异常处理扫描堆栈之前运行,即:
    1. 任何外部过滤器块都有机会运行
    2. 调试器发现异常最终未处理
    3. 外部作用域有机会发现异常最终未处理并在不运行嵌套的“finally”块的情况下终止应用程序。
  3. 如果调试器设置为陷阱未处理的异常,它将陷入重新抛出的位置,而不是发生异常的位置。

一般情况下,我认为上面指出的行为是不受欢迎的,但在某些情况下,即使外部未处理异常陷阱可能想要在之前杀死应用程序,也可能希望确保内部“finally”阻止运行结束外面的可以运行。

答案 2 :(得分:0)

正如您感兴趣的那样,您发布的代码模式几乎就是使用块转化为的内容。因此,您的代码可以重写为;

private ClassInstance GetMeANumber()
{
    using (var a = new Resource())
    {
        return a.GetClassInstance();
    }
}