g ++:无法捕获异常

时间:2017-08-26 12:57:27

标签: c++ exception gcc

我的开发环境是:Ubuntu 16.04 64bit。 g ++ 5.4.0 64位工具链。我正在将一些代码从Windows迁移到Linux,这些代码调用了ASIO lib。在某些地方,我必须有一个逻辑来捕获asio::read()asio::write()的异常。并且那些在发布和调试模式下都没有被try ... catch()捕获。因此,要了解ASIO的问题或我对它的使用,我只是把这个代码放在我的main.cpp中:

  class  Foo
  {
   public:
      Foo(){}
      void ThrowExc()
      {
        throw std::runtime_error("I am exception!");
      }
  };

  int main(int argc, char *argv[])
  {

    Foo f;
    try
    {
       f.ThrowExc();
    }
    catch(std::exception &e)
    {
       std::cout<<"Exception caught" << std::endl;
    }

它不起作用。程序崩溃,调用堆栈如下所示:

  

0 0x00007ffff57188​​bd __cxa_throw

     

1 0x000000000040e5ab Foo :: ThrowExc /main.cpp 32

     

2 0x000000000040d16c main main.cpp 45

我的C ++编译器标志是:-g;-std=c++14;-Wall;-fexceptions;-fPIC

更新

一些评论者指出,问题可能出在我的项目代码的其他地方。所以我从头开始创建一个新的空项目,main.cpp。使用上面显示的代码。仍然是同样的问题。

更新1:

我仍然不确定究竟是什么问题。但看起来我的GNU版本工具链没有正确设置。我从版本x获得了gcc,从版本Y获得了g ++。所以我重新安装了编译器并重置了他们的符号链接。使用this page作为手册。

1 个答案:

答案 0 :(得分:0)

必须在标头中声明要捕获的异常抛出异常。试试这个

class  Foo {
public:
  Foo(){}
  void ThrowExc() throw (std::exception) {
     throw std::runtime_error("I am exception!");
  }
};

int main(int argc, char *argv[]) {
  Foo f;
  try  {
    f.ThrowExc();
  }
  catch(std::exception &e) {
    std::cout<<"Exception caught" << std::endl;
  }
}