2

请注意此代码:

 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...!");
          }
          }
}
      }

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

除了上述问题之外,是否有任何情况下finally块不被执行?

4

2 回答 2

5

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

原因是这是一个不稳定的条件,不允许可靠的错误恢复(毕竟您的堆栈不可用!例如,您可以不调用您的记录器或发送电子邮件。堆栈上没有空间。)。

另一种是OutOfMemoryException(你甚至不能分配一个异常——这就是CLR预分配一个OOM实例的原因......)。我认为 ASP.NET 可以容忍这种情况,而 SQL Server 会杀死您的 appdomain。

对于正常的例外情况,这可以正常工作。

于 2013-03-25T09:57:46.733 回答
2

这将永远不会执行finally

using System;

namespace Demo
{
    public static class Program
    {
        [STAThread]
        public static void Main(string[] args)
        {
            try
            {
                Console.WriteLine("In try");
                Environment.FailFast("Aaaaaargh");
            }

            finally
            {
                Console.WriteLine("In finally");
            }
        }
    }
}
于 2013-03-25T10:00:36.547 回答