天天看點

Structed Exception Handler 學習總結(三)

SEH的應用

Windows作業系統和C/C++編譯器雖然對SHE(結果化異常處理)提供了很好的支援,但是Win32 API自身卻并沒有使用該機制來報告程式執行過程中出現的異常。

Win32 API對異常的處理是這樣的:當有異常發生時,該API函數就會傳回一些特定的值來表示函數調用失敗了,這些值有,NULL, INVALID_HANDLE_VALUE, FALSE等,同時該API函數會使用SetLastError函數來設定一個基于線程的變量,該變量表示最近一次發生異常時的錯誤碼,我們的程式在調用的API函數之後如果發現函數調用失敗(即函數傳回上述值)可以調用GetLastError來獲得該錯誤碼,通常這些錯誤碼都是一些預定義的錯誤碼(它們被定義在winerror.h檔案中),是以我們可以通過該錯誤碼獲得一些與該異常相關的資訊,利用這些資訊來控制程式的執行流程。

是以,在進行win32程式設計時,我們常常會有這樣的代碼樣式:

BOOL flag = Win32API();

    if(FALSE == flag)

    {

        switch(GetLastError())

        {

            case ERROR_CODE1:

                //......

                break;

            case ERROR_CODE2:

                //......

                break;

        }

    }

    else

    {

        //......

    }
           

我們看到,這樣的代碼中通常會有許多分支判斷和跳轉,它會損傷程式的性能,同時降低代碼的可閱讀性。如果我們使用SEH機制,則代碼會變得很清爽,例如;

__try

{

//some my owner API call

}

__except(filter expression)

{

//exception handler

}
           

是以,SEH機制常常被用在第三方庫中,或者我們自己編的應用時,也可以使用SEH來對底層的服務性API進行異常的抛出,這樣我們在用戶端代碼中就可以使用try-except來處理異常了。

繼續閱讀