- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
如果我在非托管 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/
我正在处理遗留代码。 为了修复一些错误,我必须为某些文件提供 EHa。我测试了在构建时将 EHsc 和 EHa 都赋予整个项目。这解决了我的问题,但给出警告说编译器正在用 EHa 覆盖 EH。(选项顺
您能否列出实际差异/含义的项目符号列表?我阅读了相关的 MSDN 文章,但我对异步异常的理解仍然有点模糊。 我正在使用 Boost.Test 编写一个测试套件,我的编译器发出一个警告,提示应该启用 E
Microsoft 批准的设置线程名称的方法无法在启用/EHsc 的情况下进行编译。编译器告诉我 C2712:不能在需要对象展开的函数中使用 __try http://msdn.microsoft.c
如果我在非托管 C++、Visual Studio 2008 或更高版本中创建新项目,我想使用哪种异常处理模型? 我知道/EHa 选项会导致代码效率降低,并且还会捕获 SEH 异常,对吧? 所以我一直
这个问题在这里已经有了答案: How can I switch off exception handling in MSVC? (7 个答案) Can I disable exceptions in
我是一名优秀的程序员,十分优秀!