是否存在finally块未执行的任何情况?

2 c#

请注意以下代码:

 class CTestFinally
  {
      public static void Run()
      {
          try
          {
              TryAndTry();
          }
          catch (Exception exError)
          {
              Console.WriteLine(exError.Message);
          }
          finally
          {
              Console.WriteLine("Finally...!");
          }
          Console.ReadKey();
      }

      static void TryAndTry()
      {
          try
          {
              TryAndTry();
          }
          catch (Exception exError)
          {
              Console.WriteLine(exError.Message);
          }
          finally
          {
              Console.WriteLine("Try: Finally...!");
          }
          }
}
      }
Run Code Online (Sandbox Code Playgroud)

最后从未执行因为我们得到堆栈溢出错误.

除了上述问题之外,还有哪种情况下finally块不会被执行?

usr*_*usr 5

StackOverflowException是CLR主机通常专门处理的少数几种异常之一.例如,ASP.NET将终止工作进程.这是非常难以调试,因为您的应用程序只是消失.我确信SQL Server有类似的策略(比如卸载appdomain).

原因是这是一个不稳定的情况,不允许可靠的错误恢复(在你的所有堆栈都无法使用之后!例如,你可以不调用你的记录器或发送电子邮件.堆栈上没有空间.).

另一种是OutOfMemoryException(你甚至不能分配一个Exception - 这就是CLR预先分配一个OOM实例的原因......).我认为ASP.NET容忍这一点,而SQL Server会杀死你的appdomain.

对于正常的例外,这很好.

  • 在过去的几年里,搜索有关StackOverflow异常的信息变得非常困难.:) (5认同)