拦截c ++异常

时间:2010-11-22 12:20:12

标签: c++ exception error-handling

所以我的c ++程序崩溃了,我得到的错误是:

terminate called after throwing an instance of 'std::length_error'
  what():  basic_string::_S_create
Aborted

现在,我最近添加到我的代码中的是一个SIGSEGV处理程序,所以如果它是一个分段错误,它将继续打印堆栈跟踪。

如何在c ++中为未捕获的(或更像是无法捕获的)异常制作退出处理程序?

4 个答案:

答案 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 ++异常。