Windows核心讀書筆記——SEH結構化異常處理

Ox9A82發表於2016-04-11

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,即禁止回到異常點繼續執行。

 

棧展開,由於異常處理導致程式的函式執行流程出現跳躍性,所以要把棧恢復到合適執行的位置(情況),

相關文章