我想知道哪个是更好的方法来捕获我抛出的异常:是__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