轉載請注明來源:https://www.cnblogs.com/hookjc/
碰到某些程式崩潰時彈出帶紅色叉叉的錯誤視窗或者是叫你選擇調試或關閉的視窗,很礙眼。不過平時也沒去理它,點掉就好。
今天客戶反映我們的程式崩潰後就起不來了,其實我們為了友善無人化管理,做了一個守護程序。如果程式異常退出就會重新開機那個程式,這在linux下沒問題,程式崩潰了就直接退出傳回非零值,但是window就bug了,搞不好就給你彈出個錯誤對話框,你不點掉其實程式就沒退出,守護程序就不知道這個程式是否崩潰,于是這個程式就永遠死在那個視窗上了。現在這不僅礙眼,還礙事!于是着手擺平之。
先是晚上搜到可以修改系統資料庫來組織程式或系統的彈出對話框,參考:http://technet.microsoft.com/en-us/library/cc976167.aspx。不過這不可行,我們隻是希望我們的程式不會彈出對話框,盡量少改系統的。而且試了下發現還是會彈出來,就是那個werfault.exe程序,xp下可能不會。算了,這條路不走了。
用代碼肯定也有辦法解決。你看人家qq什麼的奔潰了有彈出的都是自家的溫馨提示,我們不需要溫馨提示,隻要傳回非零值就好。
萬能的Google一下子就搜出結果來了。原來Microsoft對c和c++進行了擴充,支援異常處理,而且貌似标準c++裡的異常處理也是它的一個封裝。Microsoft的異常處理函數是__try,__except。
先試了這麼個簡單的例子
[cpp]view plaincopy
- #include <windows.h>
- #include <excpt.h>
- #include <stdio.h>
- #define CRASH_SILENTLY 1
- #if defined(_MSC_VER) && CRASH_SILENTLY
- #include <excpt.h>
- #define Q_TRY_BEGIN __try {
- #define Q_TRY_END }
- //EXCEPTION_EXECUTE_HANDLER
- #define Q_EXCEPT __except(EXCEPTION_EXECUTE_HANDLER) { \
- printf("Shit happens!\n");fflush(NULL); \
- return 1;}
- #else
- #define Q_TRY_BEGIN
- #define Q_TRY_END
- #define Q_EXCEPT
- #endif
- int main(int, char**)
- {
- Q_TRY_BEGIN
- int *a = 0;
- *a = 0;
- Q_TRY_END
- Q_EXCEPT
- printf("Exiting 0...\n");
- fflush(NULL);
- return 0;
- }
如果把CRASH_SILENTLY定義為0,那麼在程式崩潰就會彈出對話框,設為一就隻列印Shit happens!然後就傳回。
__except的參數有三種,詳細内容見http://msdn.microsoft.com/en-us/library/s58ftw19%28v=vs.80%29.aspx,我就不抄了。
其實為什麼系統會彈出這麼一個對話框呢?其實在vc運作庫中頂層函數也用了__try, __except的異常捕獲機制。不知您看了__except的參數了沒,我的示例程式裡是EXCEPTION_EXECUTE_HANDLER,表示異常被識别,就在__except後面的代碼段進行異常處理。如果是EXCEPTION_CONTINUE_SEARCH,那麼異常會繼續被派發到外層,這最外層就是vc庫,vc庫它的處理手段就是礙眼又礙事的對話框!
上面這個程式隻是示範用的,很簡單。然後我就滿懷希望地對公司的程式也做了類似的處理,然後悲劇發生了,竟然編譯都通不過!編譯錯誤是C2712:cannot use __try in functions that require object unwinding。于是又google了一番。msdn真的很棒,資料豐富,這下有時msdn上的方法解決的。詳見http://msdn.microsoft.com/en-us/library/xwtb73ad%28VS.80%29.aspx
With /EHsc, a function with structured exception handling cannot have objects that require unwinding (destruction).
我們的程式裡出現了有析構函數的對象,同時編譯參數又有/EHsc,于是出現編譯錯誤了。
更改:vs-》工程-》屬性-》c/c++-》Code Generation-》Enable C++ Exception-》NO
來源:python腳本自動遷移
