2012-03-23 41 views
5

我寫了一個簡單的程序來測試一個理論,即「finally」塊將總是執行,無論如何。 但是,我從下面的pgm看到的是,控制似乎永遠不會進入外部的finaly塊。當內部「catch」拋出時,爲什麼外層「finally」沒有被執行?

我試圖做F5和Ctrl-F5在Visual Studio中,它是相同的結果。

有人可以解釋爲什麼我看到這種行爲?

輸出控制檯窗口上是:

內抓住

內最後

外抓

未處理exeption:

..和然後應用程序崩潰

public class Program 
{ 
    static void Main() 
    { 
     try 
     { 
      try 
      { 
       string s = null; 
       s.ToString(); 
      } 
      catch 
      { 
       Console.WriteLine("inner catch"); 
       throw; 
      } 
      finally 
      { 
       Console.WriteLine("inner finally"); 
      } 

      return; 
     } 
     catch 
     { 
      Console.WriteLine("outer catch"); 
      throw; 
     } 
     finally 
     { 
      Console.WriteLine("outer finally"); 
     } 
    } 
} 

回答

7

「異常終止」在異常處理後運行。

以下是運行調試器之外這段代碼的輸出:

 
inner catch 
inner finally 
outer catch 

Unhandled Exception: System.NullReferenceException: Object reference not set to 
an instance of an object. 
    at SOConsole.Program.Main() in c:\Users\DaveShaw\Documents\Visual Studio 11\Pro 
jects\SO\SOConsole\Program.cs:line 35 
outer finally 
Press any key to continue . . . 

當發生異常會顯示以下: Exception

後,我點擊「取消」,應用恢復,顯示「外面的最後」。

如果由於某種原因,在您有機會進入「outer finally」之前關閉了應用程序,那麼您將永遠不會看到您的消息。如果一個應用程序的進程被「終止」,那麼終端將被跳過,以防它們包含阻止應用程序關閉的代碼。否則,可能無法終止該過程。

+0

哦,好的。點擊取消確實會使「外部終於:聲明」顯示出來,很高興知道這一點,謝謝 – user330612 2012-03-23 01:07:25

4

該應用程序很可能在之前終止stdout緩衝區被刷新。

無論是添加一個斷點到最後(在WriteLine)或拋出一個不同的異常從外最後確認。 A finally不是跳過:這樣做會是一個嚴重的錯誤!

+1

+1或在最後做一個自檢。 – Craig 2012-03-23 00:56:27

相關問題