问:在堆栈展开时抛出并捕获异常是否安全,或者应用程序是否在第二次抛出时调用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(...)
,但是在catch
块中使用try/catch
是否有意义--可能是在异常调用的某个函数中(在我的示例中是re
)?
2条答案
按热度按时间wmtdaxz31#
这并不是真的在堆栈解卷期间,一旦进入catch块,堆栈就已经被解卷了。
是的,这个代码是法律的的。看这个问题:Nested try...catch inside C++ exception handler?
6ojccjat2#
Pubby的答案最好地回答了你所描述的场景。
作为补充,当堆栈展开时,唯一执行的用户代码是析构函数(以及这些析构函数调用的代码)。
如果您在此场景中在析构函数中执行
throw
(并且不在同一析构函数中捕获异常),则标准指定将调用std::terminate()
。