引發軟體例外狀況
部分的程式錯誤最常見的來源不會標註為例外狀況系統。 比方說,如果您嘗試配置記憶體區塊,但沒有足夠記憶體,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 )