c ++异常未在Visual Studio 2017中捕获

时间:2018-02-03 12:55:44

标签: c++ exception-handling visual-studio-2017 options

我无法找到在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?

2 个答案:

答案 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();
}

如果你还有任何问题请在评论中提问!