可以两次输入terminate_handler吗?

时间:2010-08-23 23:06:17

标签: c++ terminate

我在terminate_handler中有一些清理,可以抛出异常。我是否需要担心捕获它以防止对terminate_handler的递归调用?使用gcc,似乎这不可能发生,我们只是进入中止。标准是真的还是未定义的行为?

2 个答案:

答案 0 :(得分:4)

终止处理程序允许返回(§18.6.3.1/ 2);它必须结束程序(默认处理程序调用{​​{1}})。如果它包括:

abort()

您将获得未定义的行为,因为您将离开该函数(因为异常传播)而没有终止该程序。因此,如果您有可能抛出的代码,请确保捕获所有异常,如下所示:

void my_terminate()
{
    throw 5;
}

然而(为了回答标题问题),我没有看到任何限制它再次输入的内容,所以这在技术上应该没问题:

void my_terminate()
{
    try
    {
        // stuff
    }
    catch(...)
    {
        // too bad
    }

    abort();
}

答案 1 :(得分:1)

不,您无法从std::terminate恢复正常的程序流程。但是,您可以,从unexpected函数中抛出一个不同的异常。 Terminate就是这样 - 程序执行在完成后终止。

编辑:

那就是说,你不应该在std::terminate中做任何复杂的事情 - 如果你在terminate,那么事情已经充分爆发,你不应该继续 - 而你不应该尝试做同样的事情,比如在std::terminate中分配内存也是出于同样的原因 - 如果由于内存不足导致程序在那里会怎么样?那里你无能为力。