问:在堆栈展开时抛出并捕获异常是否安全,或者应用程序在第二次抛出时调用terminate
?
最小例子:
void some_function()
{
try
{
// do stuff here that can throw
throw std::runtime_error("blah");
} catch(const std::exception& re)
{
try // this code could be in some function called from here
{
// do something with re here that throws a logical_error
throw std::logical_error("blah blah"); // does this call terminate?
} catch(const std::logical_error& le)
{
}
}
}
我在阅读this question后感到好奇。
注意:我知道你可以/应该在析构函数中catch(...)
,但一般来说在try/catch
块中有一个catch
是否有意义 - 可能在某些函数中被调用例外(我的例子中为re
)?
答案 0 :(得分:4)
在堆栈展开期间并不是这样。输入一个catch块后,堆栈已经解开。
是的,该代码是合法的。请参阅此问题:Nested try...catch inside C++ exception handler?
答案 1 :(得分:2)
Pubby的答案最能回答您所描述的情景。
作为附录,当堆栈正在展开时,执行的唯一用户代码是析构函数(以及析构函数调用的代码)。
如果您在此方案中在析构函数中执行 throw
,则该标准会指定将调用std::terminate()
。