try-finally 陳述式

try-finally語句是 Microsoft 特定的 擴充功能,可支援 C 和 C++ 語言中的結構化例外狀況處理。

語法

下列語法描述 try-finally 語句:

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

文法

try-finally-statement
__try compound-statement __finally compound-statement

語句 try-finally 是 C 和 C++ 語言的 Microsoft 延伸模組,可讓目標應用程式在中斷程式碼區塊時保證執行清除程式碼。 清除包含如取消配置記憶體、關閉檔案和釋放檔案控制代碼等工作。 try-finally 陳述式對於有多個地方要檢查可能會導致常式過早傳回的錯誤時會特別有用。

如需相關資訊和程式碼範例,請參閱 try-except 語句 。 如需一般結構化例外狀況處理的詳細資訊,請參閱 結構化例外狀況處理 。 如需使用 C++/CLI 處理受控應用程式中例外狀況的詳細資訊,請參閱 下的 /clr 例外狀況處理。

注意

結構化例外狀況處理可搭配 Win32 處理 C 和 C++ 原始程式檔。 不過,它不是專為 C++ 所設計。 使用 C++ 例外狀況處理可確保您的程式碼更具可移植性。 此外,C++ 例外狀況處理更有彈性,因為它可以處理任何類型的例外狀況。 針對 C++ 程式,建議您使用 C++ 例外狀況處理機制 ( trycatchthrow 語句)。

__try 子句後面的複合陳述式是保護的區段。 __finally 子句後面的複合陳述式則是終止處理常式。 處理常式會指定一組在結束受防護區段時執行的動作,無論是例外狀況(異常終止),還是標準終止結束受防護區段(正常終止)。

此時控制權會經由簡單的循序執行 (正常執行) 到達 __try 陳述式。 當控制項進入 __try 時,其相關聯的處理常式會變成作用中。 如果控制流程到達 try 區塊的結尾,執行程序如下所示:

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

  2. 當終止處理常式完成時,便會從 __finally 陳述式之後繼續執行。 不過,受防護區段結束(例如,透過 goto 受防護主體或 return 語句的輸出),終止處理常式會在控制流程移出受防護區段之前 執行

    __finally語句不會封鎖搜尋適當的例外狀況處理常式。

如果區塊中 __try 發生例外狀況,作業系統必須尋找例外狀況的處理常式,否則程式將會失敗。 如果找到處理程式,則會執行任何和所有 __finally 區塊,並在處理常式中繼續執行。

例如,假設有一系列的函式呼叫連結了函式 A 與函式 D,如下圖所示。 每個函式都具有一個終止處理常式。 如果例外狀況在函式 D 中引發,並在函式 A 中處理,則會在系統回溯堆疊時,依此順序呼叫終止處理常式:D、C、B。

Diagram of the order of termination handler execution.

此圖表以函式 A 開頭,其會呼叫函式 B,其會呼叫函式 C,其會呼叫函式 D。函式 D 會引發例外狀況。 接著會依下列順序呼叫終止處理常式:D 的終止處理常式、C 的、B 的,然後 A 會處理例外狀況。

終止處理常式執行的順序

注意

try-finally 的行為與支援使用 finally 的其他語言不同,例如 C#。 單一 __try 可能同時具有 和 __except__finally 兩者,但不能同時有 。 如果要同時使用兩個,外層的 try-except 陳述式必須以引號括住內部 try-finally 陳述式。 指定的規則在每個區塊執行時也不同。

為了與舊版相容,、 _finally 和 與 是 、 __finally__leave_leave__try 同義字, _try 除非指定編譯器選項 /Za (停用語言延伸模組)。

__leave 關鍵字

__leave關鍵字只有在語句的 try-finally 受防護區段中才有效,其效果是跳到受防護區段的結尾。 然後從終止處理常式中的第一個陳述式繼續執行。

goto語句也可以跳出受防護的區段,但它會降低效能,因為它會叫用堆疊回溯。 __leave語句更有效率,因為它不會造成堆疊回溯。

異常終止

try-finally使用 longjmp 執行時間函式結束語句會被視為異常終止。 跳入 __try 一份聲明並不合法,但跳出一份聲明是合法的。 必須在出發點(區塊正常終止 __try )和目的地( __except 處理例外狀況的區塊)之間處於作用中狀態的所有 __finally 語句。 它稱為本機 回溯

__try如果區塊因任何原因而過早終止,包括跳出 區塊,系統會在回溯堆疊的過程中執行相關聯的 __finally 區塊。 在這種情況下,如果從 區塊內 __finally 呼叫,函 AbnormalTermination 式會傳回 true ,否則會傳 false 回 。

如果在執行語句的過程中終止處理常式已終止,則不會呼叫終止 try-finally 處理常式。

END Microsoft 特定

另請參閱

撰寫終止處理常式
Structured Exception Handling (C/C++)
關鍵字
終止處理常式語法