Microsoft 專屬
try-except語句是 C 語言的Microsoft延伸模組,可讓應用程式在正常終止執行的事件發生時控制程式。 這類事件稱為例外狀況,處理例外狀況的機制稱為結構化例外狀況處理。
例外狀況可能是硬體或軟體型。 即使應用程式無法完全從硬體或軟體例外狀況中復原,結構化例外狀況處理仍可讓您記錄並顯示錯誤資訊。 協助診斷問題,有助於捕捉應用程式的內部狀態。 特別是,對於無法輕易重現的間歇性問題很有説明。
語法
try-except-statement:
__trycompound-statement__except (expression)compound-statement
子句之後的 __try 複合語句是 受防護的區段。 子句後面的 __except 複合語句是 例外狀況處理程式。 處理程式會指定在受防護區段執行期間引發例外狀況時要採取的一組動作。 執行會繼續進行,如下所示:
會執行受防護的區段。
如果在受防護區段執行期間沒有發生任何例外狀況,則子句之後
__except的語句會繼續執行。如果在受防護區段執行期間發生例外狀況,或在受防護區段呼叫的任何例程中,則會
__except評估表達式。 傳回的值會決定如何處理例外狀況。 有三個可能的值:EXCEPTION_CONTINUE_SEARCH:無法辨識例外狀況。 繼續搜尋處理程式的堆疊,先搜尋包含try-except語句,然後再搜尋優先順序為下一個最高優先順序的處理程式。EXCEPTION_CONTINUE_EXECUTION:已辨識例外狀況,但已關閉。 在發生例外狀況的點繼續執行。EXCEPTION_EXECUTE_HANDLER可辨識例外狀況。 藉由執行__except複合語句,將控制權傳送至例外狀況處理程式,然後在發生例外狀況時繼續執行。
__except因為表達式會評估為 C 運算式,所以限制為單一值、條件運算式運算子或逗號運算符。 如果需要更廣泛的處理,表達式可以呼叫傳回上述三個值之一的例程。
備註
結構化例外狀況處理適用於 C 和 C++ 原始程式檔。 不過,它並非特別針對C++所設計。 針對可攜式C++程序,應該使用C++例外狀況處理,而不是結構化例外狀況處理。 此外,C++例外狀況處理機制更有彈性,因為它可以處理任何類型的例外狀況。 如需詳細資訊,請參閱 C++ 語言參考中的例外狀況處理。
應用程式中的每個例程都可以有自己的例外狀況處理程式。 表達式 __except 會在主體的範圍內 __try 執行。 它可以存取在該處宣告的任何局部變數。
關鍵詞 __leave 在語句區塊內 try-except 有效。 的效果 __leave 是跳到 區塊的 try-except 結尾。 執行會在例外狀況處理程序結束之後繼續執行。
goto雖然 語句可以用來完成相同的結果,但 goto 語句會導致堆疊回溯。 語句 __leave 更有效率,因為它不涉及堆疊回溯。
try-except使用longjmp運行時間函式結束語句會被視為異常終止。 跳入 __try 一份聲明並不合法,但跳出一份聲明是合法的。 如果在執行 try-except 語句的過程中終止進程,則不會呼叫例外狀況處理程式。
範例
以下是例外狀況處理程式和終止處理程式的範例。 如需終止處理程式的詳細資訊,請參閱 try-finally 語句 (C) 。
.
.
.
puts("hello");
__try {
puts("in try");
__try {
puts("in try");
RAISE_AN_EXCEPTION();
} __finally {
puts("in finally");
}
} __except( puts("in filter"), EXCEPTION_EXECUTE_HANDLER ) {
puts("in except");
}
puts("world");
以下是範例的輸出,右側已新增評論:
hello
in try /* fall into try */
in try /* fall into nested try */
in filter /* execute filter; returns 1 so accept */
in finally /* unwind nested finally */
in except /* transfer control to selected handler */
world /* flow out of handler */
END Microsoft 特定