gpt4 book ai didi

c++ - Visual C++ 非托管代码 : Use/EHa or/EHsc for C++ exceptions?

转载 作者:IT老高 更新时间:2023-10-28 22:19:03 25 4
gpt4 key购买 nike

如果我在非托管 C++、Visual Studio 2008 或更高版本中创建新项目,我想使用哪种异常处理模型?

我知道/EHa 选项会导致代码效率降低,并且还会捕获 SEH 异常,对吧?

所以我一直在避开该选项,通常使用/EHsc,因此我只在 catch(...) 处理程序中捕获实际抛出的 C++ 异常,而不是捕获访问冲突和其他结构化执行.如果我的代码中存在访问冲突,我不希望它被 catch(...) {} 掩盖。

我与其他希望 catch(...) {} 什么都不做的人一起编写代码,如果存在访问冲突,他们甚至希望它这样做,这对我来说似乎是一个非常糟糕的主意。如果由于编码不好而出现错误,您不想将手指放在耳朵里大声说“啦啦啦啦啦!”这样您就不必让程序崩溃?实际上,如果代码现在因为编码错误而处于不良状态,您真的希望代码继续吗?

所以我的一般想法是/EHa 创建更大/更慢的代码,它允许程序员编写代码,如果存在 fatal error ,它将继续在未定义的状态下运行。

顺便说一句,我说的是应用程序和服务代码,这是我们编写的大部分内容。不是低级设备驱动程序或类似的东西。

请考虑一下你的想法。

最佳答案

/EHa 做了两件事。首先,如果代码分析器看不到任何可能引发 C++ 异常的代码,它会抑制忽略异常过滤器的优化,该过滤器会自动调用局部类变量的析构函数。这使得堆栈展开对于任何类型的异常都是安全的,而不仅仅是 C++ 异常。这些异常过滤器的开销是 x86 上的时间和 x86 和 x64 上的空间。

是的,它改变了 catch(...) 的行为,它现在还过滤任何 SEH 异常,而不仅仅是 C++。这确实是一场赌博,因为您捕获了所有真正令人讨厌的东西,即异步硬件异常。虽然我个人认为捕获所有 C++ 异常也不是很有防御性,但您仍然对程序状态发生突变的程度以及失败的原因有一个模糊的概念。

实际上,您需要切换到使用 __try/__except 以便您可以编写自己的异常过滤器并避免捕获不良过滤器。 C++ 异常的异常代码是 0xe04d5343(“MSC”)。使用 _set_se_translator() 将是另一种方法。

关于c++ - Visual C++ 非托管代码 : Use/EHa or/EHsc for C++ exceptions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4414027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com