就拿下面的代碼:將代碼重定向後最終運行嗎?
try
{
Response.Redirect(someurl);
}
finally
{
// Will this code run?
}
將在代碼finally塊運行?
就拿下面的代碼:將代碼重定向後最終運行嗎?
try
{
Response.Redirect(someurl);
}
finally
{
// Will this code run?
}
將在代碼finally塊運行?
是的。
試試看!
很簡單的測試:
try
{
Response.Redirect(someurl);
}
finally
{
File.WriteAllText("C:\\Temp\\test.txt", "The finally block ran.");
}
爲什麼你不只是試試呢?
finally
總是運行,除了在這些極端的情況:
是的。保證運行finally
中的代碼,除非發生災難性事件。
是的。這裏是你如何檢查我是否正確。只需放置一個消息框或從終端寫點東西到控制檯,你就會得到你的答案。
確實如此。看到這個MSDN文章:Finally always executes
「最後總是執行。」那麼,不是_always_。 http://stackoverflow.com/questions/3216046/does-the-c-finally-block-always-execute – David 2010-09-08 14:11:02
@David Touche。最後總是執行,除非CLR控制範圍以外的災難。更好?:) – 2010-09-08 18:41:24
@Dave:這只是一個有趣的主題考慮,不是嗎?我可能會在下次發現自己對候選人進行技術性預選屏幕時,將其作爲一個面試問題使用:「一個'finally'塊總是保證執行,如果不是,那麼在什麼情況下不會呢?」到目前爲止,我可以想到7個截然不同的(儘管其中有些是密切相關的)情景,這些情景會阻止它。 – David 2010-09-08 18:50:43
它會運行。 Response.Redirect實際上會拋出一個ThreadAbortException異常,所以這就是爲什麼後面的代碼不會運行(當然除了最後塊之外的任何東西)。
終端中的代碼將運行,但它會在重定向之前運行,因爲在方法返回之前重定向不會發送到瀏覽器,並且最終代碼將在該方法返回之前執行。
試試這個:
try
{
Response.Redirect("http://www.google.com");
}
finally
{
// Will this code run?
// yes :)
Response.Redirect("http://stackoverflow.com/questions/3668422/will-code-in-finally-run-after-a-redirect");
}
的一般規則是,在最終將在所有情況下(try/catch語句)應用代碼
哈哈,教人以漁...;) – 2010-09-08 14:01:02
.....你很快就會發現你應該先教他如何游泳:) – 2010-09-08 14:07:29