是否有任何情况下finally块不会被执行?

问题描述:

请注意,此代码:是否有任何情况下finally块不会被执行?

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

您的电脑吹起来。世界末日。电脑睡觉等... – rhughes 2013-03-25 09:57:11

+2

http://thedailywtf.com/Articles/My-Tales.aspx – 2013-03-25 09:58:14

+0

是的,“最后从未执行,因为我们得到堆栈溢出错误。”是Finally块不会执行的许多情况之一。查看右边的一些关于这个问题的线索。 – 2013-03-25 09:58:40

*Exception是CLR主机通常特别对待的少数几种例外之一。例如,ASP.NET将终止工作进程。这是非常难以调试,因为你的应用程序刚刚消失。 SQL Server有类似的策略,我相信(比如卸载appdomain)。

原因是这是一个不稳定的条件,不允许可靠的错误恢复(在所有堆栈不可用的情况下!例如,您可以不打电话给您的记录器或发送电子邮件。叠加)。

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

对于正常的例外,这工作正常。

+5

在过去的几年里,它也变得非常难以搜索有关*例外的信息。:) – 2013-03-25 10:00:32

这不会执行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"); 
      } 
     } 
    } 
}