2010-09-16 69 views

回答

12

您應該使用try/catch塊。

正如其他人已經回答,__try/__except是爲了捕捉SEH(窗口生成的錯誤)不捕捉一般例外。

最重要的是,__try__catch可能無法運行C++析構函數或在拋出異常時正確展開堆棧。

除極少數情況外,您不應該嘗試捕捉SEH異常。

編輯:嗯,我對此很積極(這是我總是被告知的),但是@Hans說,顯然有一個編譯器開關可以用來改變它。我認爲/EHa上的文檔對這裏發生的事情有誤導性,至少是不完整的。如果有人發現證明錯誤的權威性文檔,我會很樂意刪除這個答案。

即使事實證明這是假的,你還是應該使用trycatch僅僅是因爲他們是標準的,而__try__except都沒有。

+0

那麼它不會解開堆棧?這意味着使用'__try' /'__except'作爲崩潰報告系統以外的任何東西可能是一個非常糟糕的主意,而通常可以從'try' /'catch'塊中的異常中恢復。 – 2010-09-16 21:08:48

+2

@David:這是正確的。 '__try'和'__except'完全是基於C的API/ABI。 – 2010-09-16 21:15:00

+0

我見過的唯一不錯的用途是處理Windows本身中的錯誤(例如,當您嘗試複製設備時曾發生過什麼)。可以說,它們總是指示Windows應該爲您抓住例外的地方,並將其轉化爲錯誤。 (他們工作的方式也很可怕,而且非常非常特定於x86 ......) – 2010-09-16 21:24:56

38

他們是兩個不同的東西。 try/catch是熟悉的C++關鍵字。 __try/__except用於捕捉SEH異常。 Windows自身引發的異常,如DivisionByZero或AccessViolation。它在MSDN Library article中有很好的描述。

您還可以使用它捕捉C++異常,因爲它利用了Windows SEH功能。但是,如果您真的想要處理該異常,則無法將拋出的異常對象從其中取出,因此將會出現零上下文。這是瘋狂。頭號的方法是永遠不會抓住SEH的例外,它們總是很糟糕。如果您確實需要結婚,則使用_set_se_translator()將SEH異常轉換爲C++異常。

+3

+1對於MSDN ref。 – 2010-09-16 20:57:02

6

__try/__except設計用於調用不支持異常但使用結構化錯誤代碼/處理機制的Win32 C代碼。 __try/__except會將C錯誤轉換爲異常塊類似到C++ try/catch。

欲瞭解更多信息,請參閱this MSDN article

+0

+1 for MSDN ref – 2010-09-16 21:27:45

4

標準C++使用try/catch塊,因此如果您需要基於標準C++庫的「標準」異常機制,我會推薦使用它們。

但是,如果您打算使用通過Windows SDK提供的結構化異常處理(請參閱here),然後使用__try/__except

+0

-1:STL與異常處理完全無關。 – 2010-09-16 20:55:02

+2

STL絕對與異常處理有關:std :: exception,它是異常的推薦基類,即使它不是強制性的。 – 2010-09-16 20:56:59

+0

'std :: exception'不是STL類。 – 2010-09-16 20:57:55

1

一旦你拋出了一些東西,你不再有太多的選擇如何捕捉它。如果你拋出C++異常(即,與throw),然後使用try/catch。如果拋出Windows異常(即使用RaiseException),則使用__try/__except。試圖混合它們只會給你的生活增添不必要的麻煩。

+3

但是你不應該拋出窗口異常,因爲它們不會展開堆棧。 – 2010-09-16 21:27:05

相關問題