我在terminate_handler中有一些清理,可以抛出异常。我是否需要担心捕获它以防止对terminate_handler的递归调用?使用gcc,似乎这不可能发生,我们只是进入中止。标准是真的还是未定义的行为?
答案 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
中分配内存也是出于同样的原因 - 如果由于内存不足导致程序在那里会怎么样?那里你无能为力。