所以我的c ++程序崩溃了,我得到的错误是:
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
Aborted
现在,我最近添加到我的代码中的是一个SIGSEGV处理程序,所以如果它是一个分段错误,它将继续打印堆栈跟踪。
如何在c ++中为未捕获的(或更像是无法捕获的)异常制作退出处理程序?
答案 0 :(得分:5)
使用设置终止处理函数的set_terminate函数:
终止处理函数是一个 函数自动调用时 异常处理过程必须是 因某种原因被遗弃。这个 无法找到处理程序时发生 抛出异常,或某些异常 其他特殊情况 无法继续下去 处理过程。
答案 1 :(得分:1)
添加@vitaut的答案,如果您使用的是C ++ 11,则可以检查并获取std::set_terminate
指定的处理程序中的当前异常。
According to Daniel Krügler引用下面引用的标准,在调用std::terminate
期间有一个隐式异常处理程序处于活动状态,这意味着我们可以使用std::current_exception
检查是否存在一个活跃的例外,并检查它。
C ++ 11标准working draft N3242,第15.3.7节(强调我的):
当catch的形式参数(如果有)的初始化完成时,处理程序被认为是活动的 条款。 [注意:此时堆栈将被解开。 - 尾注] 另外,一个隐式处理程序 当由于抛出而输入std :: terminate()或std :: unexpected()时被认为是活动的。处理程序 当catch子句退出或std :: unexpected()退出后,它不再被认为是活动的 因投掷而进入。
Stealing from Andrzej's C++ blog,这是一个如何做到这一点的例子:
[[noreturn]] void onTerminate() noexcept
{
if( auto exc = std::current_exception() ) {
// we have an exception
try{
rethrow_exception( exc ); // throw to recognize the type
}
catch( MyException const& exc ) {
// additional action
}
catch( MyOtherException const& exc ) {
// additional action
}
catch( std::exception const& exc ) {
// additional action
}
catch( ... ) {
// additional action
}
}
std::_Exit( EXIT_FAILURE );
}
答案 2 :(得分:0)
只需将try
- catch(...)
放在程序的某个级别即可。像这样:
try {
doStuff();
} catch( std::exception& e ) {
//handle std::exception-derived exceptions
} catch(...) {
//handle all other exceptions
}
答案 3 :(得分:0)
您可以使用set_terminate安装自己的终止处理程序。
您可以使用catch-all子句catch (...) {}
来捕获所有C ++异常。