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

时间:2013-03-25 09:55:49

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

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

在任何情况下,finally块都不会被执行 以上问题?

2 个答案:

答案 0 :(得分:5)

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

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

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

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

答案 1 :(得分: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");
            }
        }
    }
}