Try Finally or Try Catch Finally

本文关键字:Try Finally Catch or | 更新日期: 2023-09-27 17:52:47

如果我有一个像下面这样的方法,我可以省略这里的catch块来实现相同的结果吗?:

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

Try Finally or Try Catch Finally

是的,这是完全一样的。

然而,更常见的模式是在Resource上实现IDisposable。然后,您可以使用using来更简洁地实现相同的目的。

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

" simple rethrow" catch块将产生一些效果,您可能喜欢也可能不喜欢:

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

一般来说,我认为上面指出的行为是不可取的,但在某些情况下,即使外部未处理异常陷阱可能希望在外部未处理异常陷阱运行之前杀死应用程序,也可能希望确保内部的"finally"块运行到结论。

作为兴趣点,您发布的代码模式与使用块的转换成的代码模式非常相似。所以你的代码可以重写为;

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