共用方式為


引發軟體例外狀況

部分的程式錯誤最常見的來源不會標註為例外狀況系統。 比方說,如果您嘗試配置記憶體區塊,但沒有足夠記憶體,API 函式的執行階段不會引發例外狀況而傳回錯誤碼。

不過,將任何情況視為例外狀況偵測程式碼中的該條件,然後報告它藉由呼叫 RaiseException 函式。 如此一來,標示錯誤,您可將結構化例外處理任何種類的執行階段錯誤的優點。

若要使用結構化的例外處理的錯誤:

  • 定義自己的例外狀況的程式碼的事件。

  • 呼叫 RaiseException 時偵測到問題。

  • 您可以使用例外處理的篩選器來測試定義的例外狀況代碼。

WINERROR。H 檔案會顯示例外狀況代碼的格式。 確定您沒有定義您現有的例外狀況程式碼發生衝突的程式碼,請將第三個最大顯著性的位元設定為 1。 下表所示,應該會設定四個最大顯著性的位元。

位元

建議使用的二進位設定

描述

31-30

11

這兩個位元描述程式碼的基本狀態: 11 = 錯誤,00 = 成功,01 = 資訊、 10 = 警告。

29

1

用戶端的位元。 設為 1,為使用者定義的代碼。

28

0

保留的位元。 (保留設為 0)。

您可以將前兩個位元 11 以外的設定二進位如果想要的話,雖然 「 錯誤 」 的設定是適用於大部分的例外狀況。 要記住的重點是,如上表所示設定位元 29 到 28。

產生的錯誤程式碼應該來得高的四位元設定為十六進位 e。 比方說下, 面定義會定義發生衝突任何 Windows 例外狀況代碼的例外狀況的代碼。 (您可能會,不過,需要檢查哪一個程式碼由協力廠商 Dll。)

#define STATUS_INSUFFICIENT_MEM       0xE0000001
#define STATUS_FILE_BAD_FORMAT        0xE0000002

定義例外狀況的程式碼之後,您可用它來引發例外狀況。 例如,下列程式碼會引發 STATUS_INSUFFICIENT_MEM 例外狀況,以因應記憶體配置問題:

lpstr = _malloc( nBufferSize );
if (lpstr == NULL)
    RaiseException( STATUS_INSUFFICIENT_MEM, 0, 0, 0);

如果您想要只會引發例外狀況,您可以設定為 0 的最後三個參數。 三個的最後一個參數的傳遞額外資訊並設定一個旗標,防止處理常式無法繼續執行。 請參閱 RaiseException 在Windows SDK如需詳細資訊。

在例外處理的篩選器,您可以再測試已經定義過的程式碼。 例如:

__try {
    ...
}
__except (GetExceptionCode() == STATUS_INSUFFICIENT_MEM ||
        GetExceptionCode() == STATUS_FILE_BAD_FORMAT )

請參閱

參考

撰寫例外處理常式

結構化的例外處理 (C++)