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++ 例外狀況處理機制 ( try
、 catch
和 throw
語句)。
__try
子句後面的複合陳述式是保護的區段。 __finally
子句後面的複合陳述式則是終止處理常式。 處理常式會指定一組在結束受防護區段時執行的動作,無論是例外狀況(異常終止),還是標準終止結束受防護區段(正常終止)。
此時控制權會經由簡單的循序執行 (正常執行) 到達 __try
陳述式。 當控制項進入 __try
時,其相關聯的處理常式會變成作用中。 如果控制流程到達 try 區塊的結尾,執行程序如下所示:
已叫用終止處理常式。
當終止處理常式完成時,便會從
__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 特定
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應