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

时间:2011-01-01 08:15:58

标签: c++ visual-studio

你能列出实际差异/含义的清单吗?我阅读了相关的MSDN文章,但我对异步异常的理解仍然有些模糊。

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

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

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

2 个答案:

答案 0 :(得分: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()。

答案 1 :(得分:7)

好吧,没有/ EHa,您无法捕获意外的异常,因此您的测试程序将异常退出。

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

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

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

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