要通過c++的try和catch來捕獲seh異常是可以的,而且當你用了c++的內容有時候你必須要這麼做,因為seh的__try __catch以及__finally是不能和c++的類的物件和平共處的,會出現編譯錯誤。實現起來你有一些鋪墊要做。首先你要寫乙個類,隨便乙個類,比如叫class exception,類可以什麼都沒有,乙個空的就可以了。
然後,修改編譯器的選項,在code generation裡面有乙個的c++異常選項,選擇丟擲c++異常,vc版本不同,選項地方也不同很難和你描述,但是選上之後的效果就是給編譯器增加了/eha 的開關,預設的可能是/ehsc。
然後做最後一步,寫乙個全域性函式,比如:
void throw_exception( unsigned int code, exception_pointers* ptr)
這個函式的形參必須是像上面所舉的例子一樣,注意要包含eh.h標頭檔案。然後在程式一開頭,呼叫函式_set_se_translator將你寫的函式指標告訴它:
_set_se_translator(throw_exception);
這樣就大功告成了,當出現系統異常的時候,你的函式就會被呼叫,你在函式裡丟擲異常就可以被你的catch環節給逮到。
我貼個示例**,稍微複雜一點,exception類保留了異常**和異常指標,可以供程式分析使用。**捕獲了故意產生的訪問違規,並使程式繼續執行而不被windows關閉。
#include #include // 別忘記將編譯器設定成 /eha!
class exception
~exception() {}
unsigned int code;
exception_pointers* ptrexception;
};void throw_exception( unsigned int code, exception_pointers* ptr)
int main(int argc, char* argv)
catch (exception e) }
printf("the program is running...\n");
} 上面簡單的檢查了一下異常是否為access violation,事實上,windows會產生很多的異常,常見的有陣列越界,除數為0,資料移出,堆疊錯誤,堆疊溢位等,可以在msdn網頁查到:
注意在catch中的**要當心,否則會異常巢狀,第二次異常windows可能會將其認為是不可挽回的異常,因此還是會將你的程式結束。
異常處理詳解
作為乙個開發人員,你應該感受到通過try,catch,finally塊來構建乙個結構化異常處理機制的優點。net框架提供了一大堆異常處理層次來處理不同種類的異常。所有的異常都繼承自exception 基類 你可以通過繼承來實現自定義錯誤處理以擴充套件異常處理機制。不幸的是,很多開發人員都誤用了這種架...
C 異常處理詳解
捕獲異常 捕獲異常的語法為 trycatch 異常型別 try 和 catch 都是c 中的關鍵字,後跟語句塊,不能省略 try 中包含可能會丟擲異常的語句,一旦有異常丟擲就會 獲。從 try 的意思可以看出,它只是 嘗試 捕獲異常,如果沒有異常丟擲,那就什麼也不捕獲。catch 用來處理 try ...
java詳解 異常處理
異常處理是繼承throwable的子類,有兩種 error 和 exception.error是系統崩潰或者資料庫崩潰,和 的編寫沒有關係.exception是和 有關係的,是一種異常.1.出現異常系統解決的辦法 以main函式為例 有兩種方式 main函式自己解決 把問題拋給上級去解決 誰呼叫ma...