定義
SEH是Windows系統提供的功能,跟開發工具無關。值得一提的是,VC将SEH進行了封裝try catch finally,c++中也可以用c的封裝__try{}__except(){}和__try{}__finally{}.所以當你建立一個C++try塊時,編譯器就生成一個SEH__try塊。一個C++catch測試變成一個SEH異常過濾器,并且catch中的代碼變成SEH__except塊中的代碼。實際上,當你寫一條C++throw語句時,編譯器就生成一個對Windows的Raise Exception函數的調用。用于throw語句的變量傳遞給Raise Exception作為附加的參數。
發生異常時系統的處理順序
1.系統首先判斷異常是否應發送給目标程序的異常處理例程,如果決定應該發送,并且目标程序正在被調試,則系統挂起程序并向
調試器發送EXCEPTION_DEBUG_EVENT消息.呵呵,這不是正好可以用來探測調試器的存在嗎?
2.如果你的程序沒有被調試或者調試器未能處理異常,系統就會繼續查找你是否安裝了線程相關的異常處理例程,如果你安裝了線程相關的異常處理例程,系統就把異常發送給你的程序seh處理例程,交由其處理.
3.每個線程相關的異常處理例程可以處理或者不處理這個異常,如果他不處理并且安裝了多個線程相關的異常處理例程,可交由鍊起來的其他例程處理.
4.如果這些例程均選擇不處理異常,如果程序處于被調試狀态,操作系統仍會再次挂起程序通知debugger.
5.如果程序未處于被調試狀态或者debugger沒有能夠處理,并且你調用
SetUnhandledExceptionFilter安裝了最後異常處理例程的話,系統轉向對它的調用。
6.如果你沒有安裝最後異常處理例程或者他沒有處理這個異常,系統會調用默認的系統處理程序,通常顯示一個對話框,你可以選擇關閉或者最後将其附加到調試器上的調試按鈕.如果沒有調試器能被附加于其上或者調試器也處理不了,系統就調用ExitProcess終結程序。
7.不過在終結之前,系統仍然對發生異常的線程異常處理句柄來一次展開,這是線程異常處理例程最後清理的機會。