try-except 陳述式 (C)

Microsoft 特定

try-except語句是 C 語言的 Microsoft 延伸模組,可讓應用程式控制正常終止執行的事件時的程式。 這類事件稱為例外狀況,而處理例外狀況的機制稱為結構化例外狀況處理。

例外狀況可能是硬體或軟體型。 即使應用程式無法完全從硬體或軟體例外狀況復原,結構化例外狀況處理仍可記錄並顯示錯誤資訊。 捕捉應用程式的內部狀態有助於診斷問題。 特別是,對於無法輕易重現的間歇性問題很有説明。

語法

try-except-statement:
__try compound-statement __except ( expression ) compound-statement

子句之後的 __try 複合陳述式是 受防護的區段。 子句之後的 __except 複合陳述式是 例外狀況處理常式。 處理常式會指定在受防護區段執行期間引發例外狀況時所要採取的一組動作。 執行程序如下所示:

  1. 執行保護的區段。

  2. 如果執行保護的區段時未發生例外狀況,則會在 __except 子句之後的陳述式繼續執行。

  3. 如果在執行受防護區段期間發生例外狀況,或在受防護區段呼叫的任何常式中, __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語句更有效率,因為它不包含堆疊回溯。

使用 longjmp 執行時間函式結束 try-except 語句會被視為異常終止。 跳到 __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 特定

另請參閱

try-except 語句 (C++)