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

Zai*_*zvi 27 c c++ performance exception try-catch

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

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

谢谢!

Han*_*ant 44

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

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


Bil*_*eal 17

你应该使用try/ catchblock.

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

最重要的是,__try__catch可能不运行的C++析构函数或正确地展开堆栈时则抛出异常.

除极少数情况外,您绝不应该尝试捕获SEH异常.

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

即使事实证明这是假的,你还是应该使用trycatch仅仅因为他们是标准配置,__try__except不是.

  • 那不准确.使用/ EHa进行编译可确保在堆栈展开期间进行C++析构函数调用. (6认同)
  • @David:这是对的.`__try`和`__except`严格来说是基于C的API/ABI. (2认同)
  • / EH文档就是全部.是的,这不是很好./ EHa禁止编译器优化,当编译器检测到所发出的代码都不会引发C++异常时,该优化会省略异常清除处理程序.查看机器代码时可以看到它们. (2认同)

Ran*_*pho 6

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

有关详细信息,请参阅此MSDN文章.