2013-03-25 75 views
2

請注意,此代碼:是否有任何情況下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

回答

5

StackOverflowException是CLR主機通常特別對待的少數幾種例外之一。例如,ASP.NET將終止工作進程。這是非常難以調試,因爲你的應用程序剛剛消失。 SQL Server有類似的策略,我相信(比如卸載appdomain)。

原因是這是一個不穩定的條件,不允許可靠的錯誤恢復(在所有堆棧不可用的情況下!例如,您可以不打電話給您的記錄器或發送電子郵件。疊加)。

另一種是OutOfMemoryException(你甚至不能分配一個異常 - 這就是爲什麼CLR預先分配一個OOM實例......)。我認爲ASP.NET容忍這個,而SQL Server殺死你的appdomain。

對於正常的例外,這工作正常。

+5

在過去的幾年裏,它也變得非常難以搜索有關StackOverflow例外的信息。:) – 2013-03-25 10:00:32

3

這不會執行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"); 
      } 
     } 
    } 
} 
相關問題