我的目标是,当异常没有被
try..catch
块捕获时,应该有一个全局异常处理程序来处理所有未捕获的异常。
我总是将最外层的函数包装在 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,以便用户可以对其进行操作。
我也想做同样的事情,这就是我的想法
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:|)
您可以使用
set_terminate
和 current_exception()
的组合
在 C++ 中,当未捕获异常时,会调用
terminate
函数。您可以使用 set_terminate
函数安装自己的终止处理程序。缺点是您的终止处理程序可能永远不会返回;它必须使用某些操作系统原语来终止您的程序。默认只是调用 abort()
当引发异常时,如果当时没有捕获到,则会沿着层次结构向上查找,直到实际捕获到为止。如果没有代码来处理异常,程序将终止。
您可以在终止之前运行特定代码,使用您自己的
set_unexpected
或 set_terminate
处理程序进行清理