第25章 未處理異常、向量化異常與C++異常
本章純粹是為了走過場,深入瞭解看書吧。
一、未處理異常:
1、如何出現:若異常過濾程式返回EXCEPTION_CONTINUE_SEARCH,系統繼續在調用樹的上層尋找異常過濾程式。若每個異常過濾程式都返回EXCEPTION_CONTINUE_SEARCH,就會遇到所謂的未處理異常。
2、解決方案:Windows函數SetUnhandledExceptionFilter給我們處理異常的最後機會,否則Windows就正式認為這個異常沒有得到處理。應在進程初始化階段調用這個函數。
PTOP_LEVEL_EXCEPTION_FILTERSetUnhandledExceptionFilter(
PTOP_LEVEL_EXCEPTION_FILTERpTopLevelExceptionFilter);
異常過濾函數原型必須與下相似:
LONG WINAPITopLevelUnhandledExceptionFilter(PEXCEPTION_POINTERS pExceptionInfo);
注意:若以NULL為參數調用SetUnhandledExceptionFilter,則將由UnhandledExceptionFilter來處理全域未處理異常(當使用C/C++運行庫時,在進程進入點函數執行前,C/C++運行庫會安裝一個預設的全域異常過濾程式:_CxxUnhandledExceptionFilter,此函數工作原理:首先檢查異常是不是屬於C++異常。若是,則結束時執行abort函數,後者將調用Kernel32.dll中的UnhandledExceptionFilter函數。若否,則返回EXCEPTION_CONTINUE_SEARCH,來讓Windows來處理這個異常。
);若否,則由自動以的函數來處理全域未處理異常。
二、向量化異常
SHE是一種基於代碼框的機制。Windows提供了向量化異常處理機制。程式可註冊一個函數,而不需要依賴於語言有關的關鍵字。每當異常發生或一個未處理異常脫離標準SHE控制時,此函數就會被調用。
三、C++異常與結構化異常的比較
SHE是OS提供的便利,可在任何語言中使用。而C++異常處理僅在編寫C++代碼時才可使用。若開發C++程式,就用C++異常。因C++異常是語言的一部分,編譯器知道什麼是一個C++對象,也就意味著編譯器會自動調用產生代碼來調用C++對象的解構函式,保證對象的釋放。
Visual C++編譯器用OS的結構化異常來實現C++異常處理機制。對比如下:
C++ |
try |
catch |
throw |
SEH |
__try |
__except |
RaiseException |