結構化異常處理seh(全稱structured exception handling),是windows作業系統所提供的對錯誤或異常的處理機制,是windows作業系統的乙個重要組成部分。
q : 在windows系統中,我們在開發應用程式時應該使用結構化異常還是c++異常?
a :seh是作業系統所提供的便利,它在任何語言中都可以使用。而c++異常處理只有在編寫c++**時才可以使用。如果讀者在開發c++應用程式,那就應該使用c++異常,而不是結構化異常。理由是c++異常是語言的一部分,編譯器知道什麼是乙個c++物件。這也就意味著編譯器會自動生成**來呼叫c++物件的析構函式,保證物件的釋放。
我們應該了解microsoft 的visual c++編譯器使用作業系統的結構化異常機制來實現c++異常處理機制。所以在建立乙個c++ try 塊時,編譯器會為我們生成乙個seh __try塊。c++的catch語句對應seh異常過濾程式,catch 塊中的**則對應seh __except 塊中的**。而編譯器也會為c++ throw語句生成對windowsraiseexception函式的呼叫。throw語句所使用的變數則成為raiseexception的附加引數。
下面這段**有助於更清楚地了解整個過程。
//該函式使用c++異常處理
void chunkyfunky()
try// try body
throw 5;
catch( int x)
// catch body
//該函式則演示了c++編譯器生成的對應的結構化異常處理**
void chunkyfunky()
__try
// try body
raiseexception(code = 0xe06d7363, flag = exception_noncontinuable, args = 5);
__except( (argtype == integer) ? exception_execute_handle : exception_continue_search )
// catch body
說明:傳給raiseexception 的異常**為0xe06d7363,這是visual c++開發組選擇用來丟擲乙個c++異常的軟體異常**。
microsoft visual studio的偵錯程式為異常除錯提供了出色的支援。當程序中的某個執行緒丟擲異常,作業系統會馬上通知偵錯程式(如果偵錯程式已經附著)。這個通知唄稱為「首次機會通知」。偵錯程式將響應這個通知,促使執行緒尋找異常過濾程式。如果所有的異常過濾程式都返回exception_continue_search,作業系統會給偵錯程式乙個「最後機會通知」。這兩個通知的存在使得軟體開發人員能更好地控制異常除錯的過程。
SEH結構化異常處理03
執行緒上的異常處理 異常處理函式原型 返回值有兩種 exceptioncontinueexecution異常已解決,exceptioncontinuesearch此seh未解決問題,繼續在seh鏈中搜尋 exception disposition cdecl except handler in st...
結構化異常
try,catch,finally catch中的 是對異常的恢復操作。比如有狀態的恢復,回滾。finally是做一些清理工作。foreach,using,lock實際上就是轉換成try finally這種結構 finally中就是物件的清理,foreach是對inumerator.dispose ...
C 異常和SEH異常的區別
c 異常 包括 1 語言語法範疇的錯誤 1.malloc new 操作沒收回引發的錯誤 2.bad cast動態改變型別產生的錯誤 3.bad typeid 執行rtti產生的錯誤 4.非預期的exception 2 邏輯錯誤 1.業務邏輯錯誤引發的異常 2.invalid parameters o...