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
/ catch
block.
正如其他人已经回答的那样,__try
/ __except
是用于捕获SEH(窗口生成的错误)而不是用于捕获一般异常.
最重要的是,__try
和__catch
可能不运行的C++析构函数或正确地展开堆栈时则抛出异常.
除极少数情况外,您绝不应该尝试捕获SEH异常.
编辑:嗯,我对此持肯定态度(这是我一直被告知的),但是@Hans说显然有一个编译器开关可以用来改变它.我认为这些文档对/EHa
这里发生的事情有误导性,或者至少是不完整的.如果有人找到证明这是错误的明确文档,我会很乐意删除这个答案.
即使事实证明这是假的,你还是应该使用try
和catch
仅仅因为他们是标准配置,__try
而__except
不是.