2010-09-16 81 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

相关问题