C++中的全局异常处理

Dev*_*Das 7 c++ exception-handling global

我可以在C++中实现全局异常处理吗?我的要求是try ...在一段代码中没有使用catch块然后应该有一个全局异常处理程序来处理所有未捕获的异常.

我能做到的话,请给您的宝贵建议:)

han*_*rik 6

我也想做同样的事情,这就是我的想法

    std::set_terminate([]() -> void {
        std::cerr << "terminate called after throwing an instance of ";
        try
        {
            std::rethrow_exception(std::current_exception());
        }
        catch (const std::exception &ex)
        {
            std::cerr << typeid(ex).name() << std::endl;
            std::cerr << "  what(): " << ex.what() << std::endl;
        }
        catch (...)
        {
            std::cerr << typeid(std::current_exception()).name() << std::endl;
            std::cerr << " ...something, not an exception, dunno what." << std::endl;
        }
        std::cerr << "errno: " << errno << ": " << std::strerror(errno) << std::endl;
        std::abort();
    });
Run Code Online (Sandbox Code Playgroud)
  • 除了检查 What() 之外,它还检查 ernno/std::strerror() - 将来我也打算通过 exeinfo/backtrace() 添加堆栈跟踪

  • 以防catch(...)万一有人抛出异常以外的东西..例如throw 1;( throw int :| )


lij*_*jie 5

你可以使用的组合set_terminatecurrent_exception()

  • 你应该举个例子。这个答案最有用地解决了这个问题。 (3认同)

Dan*_*röm 5

我总是将最外层的函数包装在try-catch中,如下所示:

int main()
{
   try {
      // start your program/function
      Program program; program.Run();
   }
   catch (std::exception& ex) {
      std::cerr << ex.what() << std::endl;
   }
   catch (...) {
      std::cerr << "Caught unknown exception." << std::endl;
   }
}
Run Code Online (Sandbox Code Playgroud)

这将抓住一切。在C ++中,良好的异常处理不是要遍历编写try-catch,而是要捕获您知道如何处理它的位置(就像您似乎想做的那样)。在这种情况下,唯一要做的就是将错误消息写入stderr,以便用户可以对其执行操作。