你能为未捕获的异常创建一个全局异常处理程序吗?

问题描述 投票:0回答:5

我的目标是,当异常没有被

try..catch
块捕获时,应该有一个全局异常处理程序来处理所有未捕获的异常。

c++ exception global
5个回答
8
投票

我总是将最外层的函数包装在 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;
   }
}

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


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();
    });
  • 除了检查what()之外,它还检查ernno/std::strerror() - 将来我也打算通过exeinfo/backtrace()添加堆栈跟踪

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


5
投票

您可以使用

set_terminate
current_exception()

的组合

4
投票

在 C++ 中,当未捕获异常时,会调用

terminate
函数。您可以使用
set_terminate
函数安装自己的终止处理程序。缺点是您的终止处理程序可能永远不会返回;它必须使用某些操作系统原语来终止您的程序。默认只是调用
abort()


0
投票

当引发异常时,如果当时没有捕获到,则会沿着层次结构向上查找,直到实际捕获到为止。如果没有代码来处理异常,程序将终止。
您可以在终止之前运行特定代码,使用您自己的

set_unexpected
set_terminate

处理程序进行清理
© www.soinside.com 2019 - 2024. All rights reserved.