2009-02-24 79 views

回答

25

假設進程沒有突然終止(或掛起,當然),finally塊將始終執行。

如果沒有finally塊,catch塊的異常將被拋出堆棧。請注意,導致catch塊首先執行的原始異常將被有效丟失。

堆棧溢出例外

如賈裏德指出,堆棧溢出會引起最後塊不被執行。我相信這會突然終止程序,但我可能是錯的。下面是示例代碼:

using System; 

public class Test 
{  
    static void Main() 
    { 
     // Give the stack something to munch on 
     int x = 10; 
     try 
     { 
      Main(); 
      Console.WriteLine(x); 
     } 
     finally 
     { 
      Console.WriteLine("Finally"); 
     } 
    } 
} 

結果:

過程由於StackOverflowException終止。

+2

我相信一個真正的堆棧溢出異常也可以防止最後被運行。雖然我無法找到這個文件。 – JaredPar 2009-02-24 15:18:41

+1

@Jared:是的,我認爲你很可能是對的。 OutOfMemoryException以及?不確定。將嘗試重現。 – 2009-02-24 15:20:18

6

finally塊總是會被執行。如果排除finally塊,並且在catch塊內發生異常,則catch塊之後將不執行任何代碼,因爲實質上你是catch塊將會失敗,並自己生成一個未處理的異常。

6

是catch塊後,最終總是會運行

無代碼將無法運行。

即使有finally塊,finally塊後面的任何代碼都不會運行。

4

如果在catch塊中有一個異常,finally會執行,但會拋出一個新的異常。發生異常的catch塊不會捕獲異常,它將繼續堆棧。

獲得的經驗教訓:不要在catch塊中做任何可以拋出的東西;如果你必須的話,嵌套一個try/catch塊。

try 
{ 

} 
catch() 
{ 
    try 
    { 
    // code fails here 
    } 
    catch 
    { 
    // handle that. Or not. 
    } 
} 
finally 
{ 

} 
0

如果在catch塊中發生異常,最後的所有代碼仍然會被執行。 如果堆棧中有更高級的異常處理程序(例如,此函數的調用者),它將捕獲此異常。否則會導致未處理的異常並導致應用程序失效。

catch塊中的異常點之後的代碼不會被調用。

1

finally塊將始終執行。從MSDN

finally塊可用於清理在try塊中分配的任何資源,以及運行任何即使存在異常也必須執行的代碼。無論try塊如何退出,控制總是傳遞給finally塊。

雖然catch用於處理髮生在語句塊中的異常,但最終用於保證執行語句代碼塊,而不管前面的try塊如何退出。

順便說一下,這是一種問題類型,您可以通過編寫代碼,編譯代碼以及查看執行代碼時發生的情況來輕鬆測試自己。

class Program { 
    static void Main(string[] args) { 
     try { 
      Console.WriteLine("Trying!"); 
      throw new Exception(); 
     } 
     catch (Exception e) { 
      Console.WriteLine("Catching {0}!", e.Message); 
      throw new Exception(); 
     } 
     finally { 
      Console.WriteLine("Finally!"); 
     } 
    } 
} 

此輸出:

Trying!
Catching Exception of type 'System.Exception' was thrown.!

Unhandled Exception: System.Exception: Exception of type 'System.Exception' was
thrown.
at TestFinally.Program.Main(String[] args) in C:\Documents and Settings\Me\My
Documents\Visual Studio 2008\Projects\TestFinally\TestFinally\Program.cs:line 15
Finally!
Press any key to continue . . .

0

只想添加我知道有關情況將不允許終於和任何其他代碼塊執行:

  • 在運行時拋出StackOverflowException
  • 系統的情況下。 Environment.FastFail
  • Environment.Exit
  • 如果「背景」線程終止,因爲它所屬的主程序爲 正在結束。
  • 意外關機:)
相關問題