框架型例外狀況處理
框架型例外狀況處理程式可讓您處理例外狀況在特定程式代碼序列中可能發生的可能性。 框架型例外狀況處理程式包含下列元素。
- 受防護的程式代碼主體
- 篩選表達式
- 例外狀況處理程式區塊
以框架為基礎的例外狀況處理程式是以語言特定語法宣告。 例如,在 Microsoft C/C++ 優化編譯程式中,會使用 __try 和 __except來實作。 如需詳細資訊,請參閱 處理程式語法。
受 防護的程式代碼 主體是一組一或多個語句,篩選表達式和例外狀況處理程式區塊會提供例外狀況處理保護。 受防護主體可以是程式代碼區塊、一組巢狀區塊,或整個程式或函式。 使用 Microsoft C/C++ 優化編譯程式時,受防護主體會以大括弧 ({}) 括住,後面 接著 __try 關鍵詞。
框架型例外狀況處理程式的篩選表達式是系統在受防護主體內發生例外狀況時所評估的表達式。 此評估結果會由系統執行下列其中一個動作。
- 系統會停止搜尋例外狀況處理程式、還原計算機狀態,並在發生例外狀況的點繼續執行線程。
- 系統會繼續搜尋例外狀況處理程式。
- 系統會將控制權傳輸至例外狀況處理程式,而線程執行會依序在找到例外狀況處理程式的堆疊框架中繼續執行。 如果處理程式不在發生例外狀況的堆疊框架中,系統會回溯堆棧,讓目前的堆疊框架和任何其他堆疊框架,直到回到例外狀況處理程式的堆疊框架為止。 在執行例外狀況處理程式之前,會針對因控制權傳送至例外狀況處理程式而終止之程序代碼的任何受防護主體執行終止處理程式。 如需終止處理程式的詳細資訊,請參閱 終止處理。
篩選表達式可以是簡單的運算式,也可以叫 用嘗試處理例外狀況的篩選函 式。 您可以從篩選表達式內呼叫 GetExceptionCode 和 GetExceptionInformation 函式,以取得所篩選例外狀況的相關信息。 GetExceptionCode 會傳回識別例外狀況類型的程式代碼,而 GetExceptionInformation 會傳回包含 CONTEXT 和 EXCEPTION_RECORD 結構指標的EXCEPTION_POINTERS結構指標。
這些函式無法從篩選函式內呼叫,但其傳回值可以當做參數傳遞至篩選函式。 GetExceptionCode 可以在例外狀況處理程式區塊內使用,但 GetExceptionInformation 無法,因為它指向的資訊通常是在堆疊上,而且會在控件傳送至例外狀況處理程式時終結。 不過,應用程式可以將資訊複製到安全記憶體,使其可供例外狀況處理程式使用。
篩選函式的優點是它可以處理例外狀況,並傳回值,讓系統從發生例外狀況的點繼續執行。 相反地,例外狀況處理程式區塊的執行會依序從例外狀況處理程式繼續執行,而不是從例外狀況點繼續執行。
處理例外狀況可能很簡單,例如注意錯誤,並設定稍後將檢查的旗標、列印警告或錯誤訊息,或採取一些其他有限的動作。 如果可以繼續執行,可能也需要修改內容記錄來變更計算機狀態。 如需處理頁面錯誤例外狀況的篩選函式範例,請參閱 使用虛擬記憶體函式。
UnhandledExceptionFilter 函式可用來做為篩選表示式中的篩選函式。 除非進程正在偵錯,否則它會傳回EXCEPTION_EXECUTE_HANDLER,在此情況下會傳回EXCEPTION_CONTINUE_SEARCH。