SEH是對windows系統中的異常分發和處理機制的總稱,其實現分佈在很多不同的模組中。
SEH提供了終結處理和異常處理兩種功能。
終結處理保證終結處理塊中的程式一定會被執行
1 __try
2 {
3 //要保護的程式碼
4 }
5 __finally
6 {
7 //終結處理塊
8 }
退出保護塊的方式:正常結束和非正常結束兩種
1.正常結束
正常執行並順序進入終結處理塊稱為正常結束
2.非正常結束
因為發生異常或是因為return、goto、break、continue等流程控制語句而離開被保護塊的稱為非正常結束
在終結處理塊中使用AbnormalTermination獲取被保護塊的退出方式。
__leave關鍵字在被保護塊中使用,立即結束被保護塊。屬於正常退出。
異常處理功能用於處理異常
1 __try
2 {
3 //被保護塊
4 }
5 __except(過濾表示式)
6 {
7 //異常處理塊
8 }
提供了兩個宏,可在過濾表示式或異常處理塊內使用
GetExceptionCode()返回異常程式碼
GetExceptionInformation()返回一個EXCEPTION_POINTERS結構中
1 typedef struct _EXCEPTION_POINTERS {
2 PEXCEPTION_RECORD ExceptionRecord;//異常記錄指標
3 PCONTEXT ContextRecord;//執行緒上下文指標
4 } EXCEPTION_POINTERS, *PEXCEPTION_POINTERS;
過濾表示式可以是常量,函式呼叫也可以是條件表示式,但最後值必須是1、0、-1之一。
EXCEPTION_CONTINUE_SEARCH(0)本保護塊不處理異常,系統繼續搜尋其他保護塊
EXCEPTION_CONTINUE_EXECUTION(1)已經處理異常,程式回到異常點繼續執行
EXCEPTION_EXECUTE_HANDLE(-1)讓本保護塊來處理這個
CONTEXT結構是用於恢復執行緒執行用的,其中保持了執行緒上下文。
在現實中,由於各種情況過濾表示式很難把異常處理到繼續執行的情況。
所以VC規定C++異常的異常過濾函式禁止返回EXCEPTION_CONTINUE_EXECUTION,即禁止回到異常點繼續執行。
棧展開,由於異常處理導致程式的函式執行流程出現跳躍性,所以要把棧恢復到合適執行的位置(情況),