【发布时间】:2018-02-03 12:55:43
【问题描述】:
我找不到在 Visual Studio 2017 中实际启用 C++ 异常处理的方法。也许我遗漏了一些微不足道的东西。我进行了很多搜索,但没有找到解决这个简单问题的方法。
即使是这个简单的代码也不能按预期运行:
#include <iostream>
//#include <exception>
int main(int argc, char *argv[])
{
try
{
int j = 0;
int i = 5 / j;
std::cout << "i value = " << i << "\n";
std::cout << "this line was actually reached\n";
}
catch (...)
//catch (std::exception e)
{
std::cout << "Exception caught!\n";
return -1;
}
std::cout << "Exception was NOT caught!\n";
std::cin.get();
}
当我执行这个简单的代码时,程序崩溃了,就像永远不会捕获异常一样,我也尝试了 std::exception 变体,我得到了相同的结果。
除以零只是一个例子,我也可以这样写:
ExampleClass* pClassPointer = null;
pClassPointer->doSomething();
并且期望空指针异常被 catch(...) 子句自动抛出和捕获。
作为一个信息,我添加了以下行:
std::cout << "i value = " << i << "\n";"
否则编译器优化会跳过大部分代码,结果(在 RELEASE 模式下)是:
this line was actually reached
Exception was NOT caught!
在项目的属性页面中,在“启用 C++ 异常”选项中,我的值是:“是 (/EHsc)”,所以我认为应该实际启用异常。
我错过了什么吗? 先感谢您。 安德烈亚
---- 编辑
我实际上刚刚发现,将“启用 C++ 异常”选项更改为“是 SEH 异常 (/EHa)”而不是“是 (/EHsc)”允许捕获访问冲突并除以零错误catch(...) 子句。 我还发现了有关此主题的非常有用的信息,以及在对其他线程的回复中捕获这些类型的异常是否是一个好主意: Catching access violation exceptions?
【问题讨论】:
-
除以
0是未定义的行为,通常不会导致异常。 -
"当我执行这个简单的代码时,程序崩溃了,就像永远不会捕获到异常一样" 你的代码没有抛出异常,因此它没有被捕获。
标签: c++ exception-handling visual-studio-2017 options