MSVC - /EHsc vs/EHa(同步与异步异常处理)

wat*_*180 24 c++ visual-studio

你能列出实际差异/暗示的子弹清单吗?我阅读了相关的MSDN文章,但我理解异步异常仍然有点模糊.

我正在使用Boost.Test编写测试套件,我的编译器发出警告,应该启用EHa:

警告C4535:调用_set_se_translator()需要/ EHa

项目本身仅使用普通异常(来自STL)并且不需要/ EHa切换.我是否必须使用/ EHa开关重新编译它以使测试套件正常工作?我的感觉是我只需要/ EHa参加测试.

Han*_*ant 35

当您使用/ EHsc时,编译器只会在检测到try {}块中包含的代码可能抛出C++异常时才会为异常过滤器发出代码.异常过滤器确保在处理异常时展开堆栈时调用任何本地C++对象的析构函数.它使RAII工作.

这是x86代码的优化,空间和时间,x64代码的空间.空间因为它可以省略异常过滤器代码,这是适度的btw.时间因为在x86上它可以避免在进入try {}块时注册异常过滤器.非常温和的顺便说一句.x64使用不同的方式查找异常过滤器,它是基于表的.

第一段中的关键短语是"可能抛出C++异常".在Windows上还有其他异常来源.与/ EHa中的"a"类似,硬件引发异步异常.像浮点异常,除零和强大的访问冲突异常之类的东西.但也值得注意的是,您可能与之交互的代码引发的异常类型.与托管代码一样,基本上是在VM中运行的任何内容.

如果你想让你的对象对这些异常安全,那么你需要使用/ EHa,它告诉编译器总是注册异常过滤器.

要注意/ EHa的令人讨厌的副作用,它会使catch(...)吞噬所有异常.包括你不应该捕捉的那些,比如AV和SO.看看__try/__except和_set_se_translator(),如果这对你很重要的话.


9da*_*dan 8

好吧,没有/ EHa你就无法捕捉到意想不到的异常,所以你的测试程序会异常退出.

如果可以进行异常退出测试,最好不要与EHa搏斗.

此外,将选项更改为/ EHa会产生许多副作用,包括增加可执行文件大小和性能下降.因此有效地改变了原始行为

使用或不使用/ EHa是一个通常在程序设计阶段做出的重大决定.

恕我直言,测试用例写作中的问题对于改变这个决定是微不足道的.