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來處理異常了。