我无法找到在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(...)子句自动抛出并捕获一个nullpointer异常。
就像信息一样,我添加了一行:
std::cout << "i value = " << i << "\n";"
否则编译器优化会跳过大部分代码,结果(在RELEASE模式下)是:
this line was actually reached
Exception was NOT caught!
在项目的属性页面中,在选项&#34;启用C ++异常&#34;我有价值:&#34;是(/ EHsc)&#34;,所以我认为应该实际启用例外。
我错过了什么吗? 先感谢您。 安德烈
----编辑
我实际上刚刚发现更改选项&#34;启用C ++异常&#34;值为&#34;是和SEH例外(/ EHa)&#34;而不是&#34;是(/ EHsc)&#34;允许捕获访问冲突并在catch(...)子句中除以零错误。 我还发现了有关此主题的非常有用的信息,以及在回复此其他线程时是否抓住这些类型的异常是一个好主意: Catching access violation exceptions?
答案 0 :(得分:4)
在C ++中,您 throw
是一个例外,并且在完成此操作后,您可以 catch
。如果你没有丢掉它,你就无法抓住它。
令人困惑的是,有许多种错误通常被称为“例外”。在浮点数学中尤其如此,其中任何出错的都是“浮点异常”。它是同一个词,但这些例外不是C ++异常,你无法可靠地捕获它们。
通常,当程序出现问题时,您会得到未定义的行为,也就是说,语言定义不会告诉您程序的作用。所以你是独立的:如果你的编译器记录了当程序将整数值除以0时它所做的事情,那么你可以依赖于这种行为。如果没有,不要指望任何事情。
答案 1 :(得分:0)
#include <iostream>
int main(int argc, char *argv[])
{
try
{
int j = 0;
int i ;
if(j==0)
throw j; // you have throw some variable or atleast use throw for your
//catch to work
std::cout << "i value = " << j/5<< "\n";
std::cout << "this line was actually reached\n";
}
catch (int e) /*catch will work only if the data type of argument matches with the thrown variable's data type if it does not then the compiler's default catch will run*/
{
std::cout << "Exception caught!\n";
return -1;
}
std::cout << "Exception was NOT caught!\n";
std::cin.get();
}
如果你还有任何问题请在评论中提问!