繁体   English   中英

拦截c ++异常

[英]Intercepting c++ exceptions

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

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

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

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

使用set_terminate函数设置终止处理函数:

终止处理函数是在由于某种原因必须放弃异常处理过程时自动调用的函数。 如果找不到抛出异常的处理程序,或者某些其他无法继续处理过程的异常情况,则会发生这种情况。

添加@vitaut的答案,如果您使用的是C ++ 11,则可以检查并获取std::set_terminate指定的处理程序中的当前异常。

根据DanielKrügler引用下面引用的标准,在调用std::terminate期间有一个隐式异常处理程序处于活动状态,这意味着我们可以使用std::current_exception来检查是否存在活动异常并检查它。

C ++ 11标准工作草案N3242 ,第15.3.7节( 强调我的):

当catch子句的形式参数(如果有)的初始化完成时,处理程序被认为是活动的。 [注意:此时堆栈将被解开。 - 结束注释] 此外,当由于throw而输入std :: terminate()或std :: unexpected()时,隐式处理程序被认为是活动的 当catch子句退出或std :: unexpected()因输入而退出后退出时,处理程序不再被视为活动状态。


从Andrzej的C ++博客窃取 ,这是一个如何做到这一点的例子:

[[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 );
}

只需将try - catch(...)放在程序的某个级别即可。 像这样的东西:

try {
   doStuff();
} catch( std::exception& e ) {
  //handle std::exception-derived exceptions
} catch(...) {
  //handle all other exceptions
}     

您可以使用set_terminate安装自己的终止处理程序。

您可以使用catch-all子句catch (...) {}捕获所有C ++异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM