Share via


try finally 陳述式

Microsoft 專有的

下列的語法用於描述try-finally陳述式:

__try {
   // guarded code
}
__finally {
   // termination code
}

文法

  • 請試著最後的陳述式
    __try 複合陳述式

    __finally 複合陳述式

try-finally陳述式是 c 和 C++ 語言的 Microsoft 延伸可讓目標應用程式,以確保清除程式碼執行時執行的程式碼區塊將會中斷。 清除是由解除配置記憶體,關閉檔案,並釋出的檔案控制代碼等工作所組成。 try-finally陳述式是特別有用,如有其中一項檢查由便可能會導致錯誤過早的幾個地方的常式傳回的常式。

如需相關的資訊的程式碼範例中,請參閱試-除非陳述式。 如需有關結構化例外處理一般的詳細資訊,請參閱結構化例外處理。 如需有關受管理的應用程式中處理例外狀況的詳細資訊,請參閱例外狀況處理在 /clr 之下

注意事項注意事項

處理在 win32 中的運作方式,如 c 與 C++ 的來源檔的結構化例外狀況。不過,它是不被專門針對 C++。您可以確保您的程式碼使用 C++ 例外處理會更好移植。此外,C++ 例外處理會更有彈性,因為它可以處理任何型別的例外狀況。C + + 程式,建議您使用的 C++ 例外處理機制 (嘗試、 攔截,並擲回陳述式)。

複合陳述式之後, __try子句是保護的區段。 複合陳述式之後, __finally子句是終止處理常式。 這個處理常式指定一組結束保護的區段,不論保護的區段由例外狀況 (不正常終止),或標準落入 (正常結束) 已結束時執行的動作。

控制到達__try陳述式的簡單循序執行 (失敗)。 當控制項進入__try,其相關聯的處理常式就會變成使用中。 若當控制流程到達 try 區塊的結尾,如下繼續執行:

  1. 終止處理常式會叫用。

  2. 終止處理常式完成後之後, 會繼續執行__finally陳述式。 不論如何保護區段結束 (比方說,透過goto超出保護內文或return陳述式),終止處理常式會執行before的控制流程移出保護的區段。

    A __finally 陳述式不會封鎖搜尋適當的例外處理常式。

如果發生例外狀況在__try區塊中,作業系統必須尋找例外狀況的處理常式] 或 [程式將會失敗。 如果找到,各位提出__finally區塊會執行,並在處理常式則繼續執行。

例如,假設一系列的函式呼叫的連結函式 a 運作 d,如下圖所示。 每個函式有一個終止處理常式。 如果函式 d 中引發例外狀況,且在 a 中的處理,終止處理常式會呼叫順序如下如系統回溯堆疊: C、 D b。

終止處理常式執行順序

處理常式執行順序終止

注意事項注意事項

Try 最後的行為會不同於某些支援使用的語言最後,例如 C#。單一個__try可能會有可能,但非兩者的__finally和__except。如果兩者一起使用時,外部試著-除了陳述式必須將內部 try-finally 陳述式。規則,以指定每個區塊執行時也會不同。

__Leave 關鍵字

__leave關鍵字是只能在保護的區段的try-finally陳述式,而其效果會跳到保護區段結尾。 在終止處理常式中的第一個陳述式會繼續執行。

A goto陳述式也可以跳完保護區段中,但它會降低效能,因為它會叫用堆疊回溯。 __leave陳述式會比較有效率,因為它不會造成堆疊回溯。

異常終止

結束try-finally陳述式使用longjmp執行階段函式會被視為不正常終止。 不能跳到應在__try陳述式,但是跳足夠的法律。 所有__finally之間的點出發的作用中的陳述式 (正常結束的__try區塊) 與目的地 ( __except區塊處理例外狀況) 必須執行。 這稱為區域回溯。

如果 由於任何原因,包括區塊用完跳過早結束區塊,系統會執行相關的 最後的處理程序一部份的回溯堆疊的區塊。 在這種情況下, AbnormalTermination 函式會傳回 TRUE,如果在呼叫最後封鎖。 否則,它會傳回 FALSE。

如果處理程序已刪除的執行,不會呼叫終止處理常式try-finally陳述式。

結束 Microsoft 特定

請參閱

參考

撰寫終止處理常式

結構化的例外處理 (C++)

C + + 關鍵字

Termination-Handler Syntax