簡體   English   中英

為什么這“最終”執行?

[英]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語句執行如下:

  • 如果goto語句退出一個或多個具有關聯的finally塊的try塊,則控制最初被轉移到最里面的try語句的finally塊。 當控制到達finally塊的結束點時,控制權轉移到下一個封閉的try語句的finally塊。 重復此過程,直到執行了所有介入的try語句的finally塊。
  • 控制權轉移到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塊不會運行。

誰想嘗試列出所有這些?

似乎合理。 始終在trycatch之后運行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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM