共用方式為


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例外狀況處理

備註

結構化例外狀況處理適用於 C 和 C++ 原始程式檔的 Win32。 不過,它並非特別針對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。

終止處理程式執行順序的圖表。

此圖表以函式 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 特定

另請參閱

撰寫終止處理程式
結構化例外狀況處理 (C/C++)
關鍵字
終止處理程式語法