[英]Why does this “finally” execute?
如果你運行下面的代碼,它實際上在每次調用goto后執行finally:
int i = 0;
Found:
i++;
try
{
throw new Exception();
}
catch (Exception)
{
goto Found;
}
finally
{
Console.Write("{0}\t", i);
}
為什么?
以下文本來自C#語言規范 ( 8.9.3 goto語句 )
goto語句執行如下:
你為什么期望它不執行?
如果你有try / catch / finally或try / finally阻塞,
那么無論你在try或catch塊中使用的代碼
大多數時間都是塊執行。
而不是goto,考慮'返回'。
//imagine this try/catch/finally block is inside a function with return type of bool.
try
{
throw new Exception();
}
catch (Exception)
{
return false; //Let's say you put a return here, finally block still executes.
}
finally
{
Console.WriteLine("I am in finally!");
}
給出答案的要點 - 當控制通過任何方式離開受保護區域時,無論是“返回”,“轉到”,“中斷”,“繼續”還是“拋出”,執行“最終”都是正確的。 但是,我注意到幾乎每個答案都說“最后一塊總是運行”。 finally塊並不總是運行。 在很多情況下,finally塊不會運行。
誰想嘗試列出所有這些?
似乎合理。 始終在try
或catch
之后運行finally
塊。
同樣
try
{
// do something
return;
}
finally
{
// do something else
}
將始終運行finally
塊。 編輯 - 但請參閱Eric的上述評論。
這是設計的。 在異常處理程序中,您可以執行一些特定於異常的操作。 在finally塊中你應該進行資源清理 - 這就是為什么finally塊總是被執行,無論異常處理代碼是什么。
正如人們所提到的,無論程序流程如何, finally
都會運行。 當然, finally
塊是可選的,所以如果你不需要它,不要使用它。
因為finally
語句應該在離開try
之后執行(或者在catch
異常時捕獲)。 這包括您進行goto通話時。
這是finally
塊的重點。 它總是執行(幾乎)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.