什么是更好的使用,__try / __除块或try / catch块?

时间:2010-09-16 20:44:46

标签: c++ c performance exception try-catch

我想知道哪种方法可以捕获我抛出的异常:是__try / __except块还是try / catch块?

我正在用C ++编写,该程序只能在Windows上使用,因此可移植性不是问题。

谢谢!

5 个答案:

答案 0 :(得分:44)

他们是两个非常不同的东西。 try / catch是您熟悉的熟悉的C ++关键字。 __try/__except用于捕获SEH例外。 Windows本身引发的异常,例如DivisionByZero或AccessViolation。它在MSDN Library article中有详细描述。

您还可以使用它来捕获C ++异常,因为它利用了Windows SEH功能。但是,您无法从中获取抛出的异常对象,因此如果您确实希望处理异常,则将没有上下文。哪个是疯了。头号方法是永远不会捕获SEH例外,它们总是很严重。如果你确实需要将两者结合,那么使用_set_se_translator()将SEH异常转换为C ++异常。

答案 1 :(得分:17)

您应该使用try / catch阻止。

正如其他人已经回答的那样,__try / __except用于捕获SEH(窗口生成的错误),而不是用于捕获常规异常。

最重要的是,__try__catch可能无法运行C ++析构函数,或者在抛出异常时正确展开堆栈。

除极少数情况外,您绝不应该尝试捕获SEH例外情况。

编辑:嗯,我对此持肯定态度(这是我一直被告知的事情),但@Hans说显然有一个编译器开关可以用来改变它。我认为/EHa上的文档对这里发生的事情有误导性,或者至少是不完整的。如果有人找到证明这个错误的明确文档,我很乐意删除这个答案。

即使事实证明这是错误的,您仍然应该使用trycatch,因为它们是标准的,而__try__except则不是。{/ p>

答案 2 :(得分:6)

__try/__except用于调用Win32 C代码,该代码不支持异常但使用结构化错误代码/处理机制。 __try/__except会将C错误转换为异常块类似到C ++ try / catch。

有关详细信息,请参阅this MSDN article

答案 3 :(得分:4)

标准C ++使用try / catch块,因此如果您需要基于标准C ++库的“标准”异常机制,我建议使用它们。

但是,如果您计划使用通过Windows SDK提供的结构化异常处理(请参阅here),请使用__try / __except

答案 4 :(得分:1)

一旦你抛出一些东西,你就不再有太多选择如何抓住它。如果您抛出C ++异常(即throw),则使用try / catch。如果您抛出Windows异常(即使用RaiseException),请使用__try / __except。试图混合它们只会给你的生活带来不必要的麻烦。