你能给出一个关于实际差异/含意的要点清单吗?我阅读了相关的MSDN文章,但我对异步异常的理解仍然有点模糊。
我正在使用Boost.Test编写一个测试套件,我的编译器发出了一个警告,即应该启用EHa:
警告C4535:调用_set_se_translator()需要/EHa
项目本身只使用普通的异常(来自STL),不需要/EHa开关。我是否必须用/EHa开关重新编译它,以使测试套件正常工作?我的感觉是,我只需要/EHa的试衣。
发布于 2011-01-01 14:16:56
当您使用/EHsc时,编译器只有在发现包装在try {}块中的代码可能引发C++异常时,才会发出异常筛选器的代码。异常筛选器确保在处理异常时,在打开堆栈时调用任何本地C++对象的析构函数。这能让RAII发挥作用。
这是一个优化,x86代码的空间和时间,x64代码的空间。空格,因为它可以省略异常筛选器代码,这是适度的。时间,因为在x86上,它可以避免在进入try {}块时注册异常筛选器。一点也不过分。x64使用另一种方法来查找异常过滤器,它是基于表的.
第一段中的关键短语是“可能引发C++异常”。在Windows上还有其他的异常来源。就像/EHa中的"a“一样,由硬件引发的异步异常。比如浮点异常,除以零,以及全能访问冲突异常.但也值得注意的是,您可能与之交互的代码引发的异常类型。就像托管代码一样,基本上任何在VM中运行的代码。
当您希望使您的对象对这类异常安全时,您将需要使用/EHa,这告诉编译器始终注册异常筛选器。
小心/EHa的不良副作用,它能捕获(.)吞下所有的例外。包括那些你永远抓不到的,比如AV等等。如果这对您来说很重要,请看__try/__except
和_set_se_translator()。
发布于 2011-01-01 08:41:04
如果没有/EHa,您就无法捕获意外的异常,因此您的测试程序将异常退出。
如果可以对异常退出进行测试,最好不要与/EHa搏斗。
此外,将选项更改为/EHa会产生许多副作用,包括增加可执行文件的大小和减少性能下降。从而有效地改变了原有的行为。
使用或不使用/EHa是一个重大的决定,通常是在程序设计阶段。
IMHO,测试用例编写中的问题对于改变这个决定来说是微不足道的。
https://stackoverflow.com/questions/4573536
复制相似问题