【问题标题】:g++ : Can't catch an exceptiong++:无法捕获异常
【发布时间】:2018-02-04 08:14:40
【问题描述】:

我的开发环境是:Ubuntu 16.04 64bit。 g++ 5.4.0 64 位工具链。我正在将一些涉及ASIO lib 的代码从Windows 移植到Linux。在某些地方我必须有一个逻辑来捕获来自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.cpp 45

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

更新:

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

更新 1:

我仍然不确定确切的问题是什么。但看起来我的 GNU 版本工具链设置不正确。我有版本 x 的 gcc 和版本 Y 的 g++。所以我重新安装了编译器并重置了它们的符号链接。手动使用this page

【问题讨论】:

  • 我多么喜欢那些反对者。 const 在这里不是问题。谢谢你的提示。讨厌的地方已经变成了问东西。
  • @user0042 不正确。参考文献this
  • @user0042 但您可能希望在重新抛出之前向异常添加一些重要信息
  • @user0042 - 最好使用所有 OP 的编译器标志。 But yes, no reproducing it with them as well.
  • @user0042 - 依赖“句点”的参数是不好的参数。它们大多表明您无法如实支持您的主张,因此需要依赖教条。

标签: c++ exception gcc


【解决方案1】:

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

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;
  }
}

【讨论】:

  • 动态 throw 规范已过时且已弃用。这无济于事。
  • "throw 规范已经过时和弃用" ???你的意思是现在,所有的异常都是可以捕获的?
  • 不确定你的意思。动态异常规范已替换为 noexcept 规范。
  • 所有异常总是可以捕获的。动态抛出规范所做的是在抛出其他东西时调用 std::terminate()
猜你喜欢
  • 1970-01-01
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2021-10-09
  • 2021-09-17
  • 2021-10-03
  • 2018-02-04
相关资源
最近更新 更多