在一個try/catch/finally塊,如:在.NET中,如果catch塊中的某些內容失敗,最終總是會被調用?
try
{
}
catch()
{
// code fails here
}
finally
{
}
所以,如果有在catch塊中的異常,最終將永遠被調用?
如果最後沒有,那麼catch塊之後的代碼會運行嗎?
在一個try/catch/finally塊,如:在.NET中,如果catch塊中的某些內容失敗,最終總是會被調用?
try
{
}
catch()
{
// code fails here
}
finally
{
}
所以,如果有在catch塊中的異常,最終將永遠被調用?
如果最後沒有,那麼catch塊之後的代碼會運行嗎?
假設進程沒有突然終止(或掛起,當然),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終止。
finally塊總是會被執行。如果排除finally塊,並且在catch塊內發生異常,則catch塊之後將不執行任何代碼,因爲實質上你是catch塊將會失敗,並自己生成一個未處理的異常。
是catch塊後,最終總是會運行
無代碼將無法運行。
即使有finally塊,finally塊後面的任何代碼都不會運行。
如果在catch塊中有一個異常,finally會執行,但會拋出一個新的異常。發生異常的catch塊不會捕獲異常,它將繼續堆棧。
獲得的經驗教訓:不要在catch塊中做任何可以拋出的東西;如果你必須的話,嵌套一個try/catch塊。
try
{
}
catch()
{
try
{
// code fails here
}
catch
{
// handle that. Or not.
}
}
finally
{
}
如果在catch塊中發生異常,最後的所有代碼仍然會被執行。 如果堆棧中有更高級的異常處理程序(例如,此函數的調用者),它將捕獲此異常。否則會導致未處理的異常並導致應用程序失效。
catch塊中的異常點之後的代碼不會被調用。
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 . . .
只想添加我知道有關情況將不允許終於和任何其他代碼塊執行:
我相信一個真正的堆棧溢出異常也可以防止最後被運行。雖然我無法找到這個文件。 – JaredPar 2009-02-24 15:18:41
@Jared:是的,我認爲你很可能是對的。 OutOfMemoryException以及?不確定。將嘗試重現。 – 2009-02-24 15:20:18