C 異常 和 SEH異常 的一點小結

2021-10-09 19:35:05 字數 1258 閱讀 4523

「c++異常」 就是 try{}catch(...){}

「seh異常」 就是 __try{} __except(-1/0/1){}

目前微軟所有的vc編譯器(從vc6到vc2010),都預設是開啟對c++異常的編譯支援的(位於專案選項中的「**生成」->啟用c++異常:/ehsc,vc6是enable exception handling)

如:trycatch(...),執行到*a=100時,會跳轉到catch塊,並執行printf。

但是,vc6建立的dll或其他非exe工程,如果是release模式,並且編譯時,啟用了**自動優化,那麼結果就變成了只啟用了「c++異常」,即「c++異常無法捕獲seh異常」。這樣的乙個後果是,在dll中,即使像這樣用trycatch(...)保護**,當**執行到*a=100非法位址賦值語句時,catch(...)卻什麼都捕獲不到,會直接造成程式崩潰。

除非明確使用「seh異常」__try...__except(1)..,才能捕獲到這種windows異常。

對於從vc7開始以及以後的vc++,在「**生成」->「啟用c++異常」處,均有第三個選項:「有效,但有seh異常(/eha)」,這樣就是可以讓程式「使用c++異常也能夠捕獲到seh異常」。這樣無論是在exe還是dll中,try{}catch(...){}同樣可以捕獲windows異常。

對於vc6的非exe工程,有以下兩個方法,來用try..catch..捕獲windows的seh異常:

1、通過關閉編譯時的優化(禁用或者只使用default級別,個人感覺是因為vc6的編譯器不是非常完善)。

2、通過在當前工程的編譯選項中,手工加上 /eha 引數。這個編譯選項是沒有介面可以去設定的,只能手工新增。

這兩個方法選擇任何乙個都可以。建議使用第二個方法。另外要注意「c++異常」與「seh異常」無法同時在同乙個函式中混用。

per-thread型別seh(也稱為**執行緒異常處理**),用來監視某執行緒**是否發生異常。

final型別seh(也成為程序異常處理、篩選器或頂層異常處理),用於監視整個程序種所有執行緒是否發生異常。在整個程序種,該型別異常處理只有乙個,可通過setunhandledexceptionfilter設定。

「c++異常」 就是 try{}catch(...){}

「seh異常」 就是 __try{} __except(-1/0/1){}

目前微軟所有的vc編譯器(從vc6到vc2010),都預設是開啟對c++異常的編譯支援的(位於專案選項中的「**生成」->啟用c++異常:/ehsc,vc6是enable exception handling)

C 異常 和 SEH異常 的一點小結

如何區分異常 c 異常 就是 try catch seh異常 就是 try except 1 0 1 目前微軟所有的vc編譯器 從vc6到vc2010 都預設是開啟對c 異常的編譯支援的 位於專案選項中的 生成 啟用c 異常 ehsc,vc6是enable exception handling 捕獲...

C 異常和SEH異常的區別

c 異常 包括 1 語言語法範疇的錯誤 1.malloc new 操作沒收回引發的錯誤 2.bad cast動態改變型別產生的錯誤 3.bad typeid 執行rtti產生的錯誤 4.非預期的exception 2 邏輯錯誤 1.業務邏輯錯誤引發的異常 2.invalid parameters o...

日誌和異常的一點規範

可以用 slf4j註解代替logge ctory.getlogger xx.class 簡化 注 slf4j是lombok裡的。日誌列印放到controller層和gateway層,rpc呼叫外部介面的異常直接列印 service層視情況可以不用列印,避免重複列印 異常列印的引數用佔位符 引數校驗只...