抛出异常实例后终止调用,核心转储

时间:2019-01-02 18:40:11

标签: c++ c++11 exception

我正在检查C ++异常,并且遇到一个我不确定为什么会给我带来问题的错误:

 #include <iostream>
 #include <exception>

 class err : public std::exception
 {
 public:
      const char* what() const noexcept { return "error"; }
 };

 void f() throw()
 {
      throw err();
 }

 int main()
 {
      try
      {
           f();
      }
      catch (const err& e)
      {
           std::cout << e.what() << std::endl;
      }
 }

运行它时,出现以下运行时错误:

 terminate called after throwing an instance of 'err'
   what():  error
 Aborted (core dumped)

如果我将try/catch逻辑完全移到f(),即

 void f() 
 {
      try
      {
           throw err();
      }
      catch (const err& e)
      {
            std::cout << e.what() << std::endl;
      }
 }

只需从main调用它(在main中没有try / catch块),那么就没有错误。我是否不了解某些东西,因为它与从函数中引发异常有关?

1 个答案:

答案 0 :(得分:16)

throw()中的void f() throw()dynamic exception specification,自c ++ 11起不推荐使用。应该使用它来列出函数可能抛出的异常。空规范(throw())表示函数不会抛出任何异常。尝试从此类函数引发异常时调用std::unexpected,该函数默认情况下会终止。

从c ++ 11开始,指定函数不能抛出的首选方法是使用noexcept。例如void f() noexcept