【问题标题】:c++ exceptions not caught in visual studio 2017c++ 异常未在 Visual Studio 2017 中捕获
【发布时间】: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?

【问题讨论】:

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


【解决方案1】:

在 C++ 中,您的 throw 是一个例外,并且在完成此操作后,您可以 catch 它。不扔就抓不住。

令人困惑的是,有多种错误通常被称为“异常”。在浮点数学中尤其如此,其中任何错误都是“浮点异常”。它是同一个词,但那些异常不是 C++ 异常,您无法可靠地捕获它们。

一般来说,当您的程序出现问题时,您会得到未定义的行为,也就是说,语言定义不会告诉您程序做了什么。因此,您只能靠自己:如果您的编译器记录了程序将整数值除以 0 时的行为,那么您可以依赖该行为。如果没有,不要指望任何东西。

【讨论】:

    【解决方案2】:
    #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();
    }
    

    如果您还有任何问题,请在 cmets 中提问!

    【讨论】:

    • 嗨,谢谢你的澄清。看来实际上我对 c++ 异常一无所知。我习惯了 java 和 c# 异常,我认为 catch(...) 子句会(神奇地)捕获相应 try catch 块中发生的每个违规行为。
    • 你可以使用 catch(...) 也是完全有效的!但是如果你想在运行时区分错误,你应该使用数据类型参数!
    猜你喜欢
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2023-03-06
    • 2018-02-21
    • 1970-01-01
    • 2016-11-11
    相关资源
    最近更新 更多