c 異常捕獲

2022-03-15 02:09:03 字數 1227 閱讀 1610

概念:

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

(...){}

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

){}(關於這兩種異常,如有不了解的地方,網上有很多資料可以參考)

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

(以下需要仔細閱讀)

在vc6中,對exe工程是同時預設開啟「c++異常可以捕獲seh異常」。在此條件下,用「c++異常」也可以捕獲向非法位址的讀寫等基本的windows異常。

如: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異常」無法同時在同乙個函式中混用。

更多 0

最好不要用c++異常去捕獲seh異常。

c 異常捕獲

概念 c 異常 就是 try catch seh異常 就是 try except 1 0 1 關於這兩種異常,如有不了解的地方,網上有很多資料可以參考 目前微軟所有的vc編譯器 從vc6到vc2010 都預設是開啟對c 異常的編譯支援的 位於專案選項中的 生成 啟用c 異常 ehsc,vc6是ena...

C 異常捕獲

本文章純屬是為了加深記憶,便於學習。若對c 的理解有錯誤,望指出,謝謝。異常捕獲通常發生在輸入不規範。當想要接收整數型別的資料時,控制台卻輸入了其他型別資料,例如字串型別。導致出現異常。try catch 執行過程 如果try中的 沒有出現異常,那麼catch中的 不會執行。如果try中的 出現了異...

C 異常捕獲

一 背景 二 簡介 我們在程式中經常會出現各種各樣的異常,你如果想要你的程式更加穩定性,在你的 中應該經常使用try cath來進行異常捕獲。哪行 有可能出現異常,我們就使用try cath。三 語法 try可能會出現異常的 cath 出現異常後要執行的 執行過程 如果try中的 沒有出現異常,那麼...