关于c#:是否存在finally块未执行的任何情况?


Are there any circumstances under which the finally block does not get executed?

本问题已经有最佳答案,请猛点这里访问。

请注意此代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
 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...!");
          }
          }
}
      }

最后永远不会执行,因为我们得到了堆栈溢出错误。

在任何情况下,除了以上问题?


StackOverflowException是CLR主机通常特别处理的少数几种异常之一。例如,ASP.NET将终止工作进程。这很难调试,因为您的应用程序刚退出。我敢肯定,SQL Server有类似的策略(比如卸载AppDomain)。

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

另一种类型是outofmemoryException(甚至不能分配异常-这就是为什么clr预先分配一个oom实例…)。我认为ASP.NET可以容忍这种情况,而SQL Server会杀死您的AppDomain。

对于正常的例外情况,这是正常的。


这永远不会执行finally

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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");
            }
        }
    }
}