C 異常與結構化異常SEH的比較

2021-06-22 00:49:55 字數 1462 閱讀 8391

結構化異常處理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...