我想知道哪個是更好的方法來捕獲我拋出的異常:是__try/__except塊還是try/catch塊?有什麼更好的使用,__try/__ except塊或try/catch塊?
我用C++編寫程序只會在Windows上使用,所以可移植性不是問題。
謝謝!
我想知道哪個是更好的方法來捕獲我拋出的異常:是__try/__except塊還是try/catch塊?有什麼更好的使用,__try/__ except塊或try/catch塊?
我用C++編寫程序只會在Windows上使用,所以可移植性不是問題。
謝謝!
您應該使用try
/catch
塊。
正如其他人已經回答,__try
/__except
是爲了捕捉SEH(窗口生成的錯誤)不捕捉一般例外。
最重要的是,__try
和__catch
可能無法運行C++析構函數或在拋出異常時正確展開堆棧。
除極少數情況外,您不應該嘗試捕捉SEH異常。
編輯:嗯,我對此很積極(這是我總是被告知的),但是@Hans說,顯然有一個編譯器開關可以用來改變它。我認爲/EHa
上的文檔對這裏發生的事情有誤導性,至少是不完整的。如果有人發現證明錯誤的權威性文檔,我會很樂意刪除這個答案。
即使事實證明這是假的,你還是應該使用try
和catch
僅僅是因爲他們是標準的,而__try
和__except
都沒有。
他們是兩個很不同的東西。 try/catch是熟悉的C++關鍵字。 __try/__except
用於捕捉SEH異常。 Windows自身引發的異常,如DivisionByZero或AccessViolation。它在MSDN Library article中有很好的描述。
您還可以使用它捕捉C++異常,因爲它利用了Windows SEH功能。但是,如果您真的想要處理該異常,則無法將拋出的異常對象從其中取出,因此將會出現零上下文。這是瘋狂。頭號的方法是永遠不會抓住SEH的例外,它們總是很糟糕。如果您確實需要結婚,則使用_set_se_translator()將SEH異常轉換爲C++異常。
+1對於MSDN ref。 – 2010-09-16 20:57:02
__try/__except
設計用於調用不支持異常但使用結構化錯誤代碼/處理機制的Win32 C代碼。 __try/__except
會將C錯誤轉換爲異常塊類似到C++ try/catch。
欲瞭解更多信息,請參閱this MSDN article。
+1 for MSDN ref – 2010-09-16 21:27:45
標準C++使用try/catch塊,因此如果您需要基於標準C++庫的「標準」異常機制,我會推薦使用它們。
但是,如果您打算使用通過Windows SDK提供的結構化異常處理(請參閱here),然後使用__try
/__except
。
-1:STL與異常處理完全無關。 – 2010-09-16 20:55:02
STL絕對與異常處理有關:std :: exception,它是異常的推薦基類,即使它不是強制性的。 – 2010-09-16 20:56:59
'std :: exception'不是STL類。 – 2010-09-16 20:57:55
一旦你拋出了一些東西,你不再有太多的選擇如何捕捉它。如果你拋出C++異常(即,與throw
),然後使用try
/catch
。如果拋出Windows異常(即使用RaiseException
),則使用__try
/__except
。試圖混合它們只會給你的生活增添不必要的麻煩。
但是你不應該拋出窗口異常,因爲它們不會展開堆棧。 – 2010-09-16 21:27:05
那麼它不會解開堆棧?這意味着使用'__try' /'__except'作爲崩潰報告系統以外的任何東西可能是一個非常糟糕的主意,而通常可以從'try' /'catch'塊中的異常中恢復。 – 2010-09-16 21:08:48
@David:這是正確的。 '__try'和'__except'完全是基於C的API/ABI。 – 2010-09-16 21:15:00
我見過的唯一不錯的用途是處理Windows本身中的錯誤(例如,當您嘗試複製設備時曾發生過什麼)。可以說,它們總是指示Windows應該爲您抓住例外的地方,並將其轉化爲錯誤。 (他們工作的方式也很可怕,而且非常非常特定於x86 ......) – 2010-09-16 21:24:56