抛出/捕获堆栈放松是否安全?

时间:2013-03-19 19:17:35

标签: c++ exception-handling stack-unwinding

问:在堆栈展开时抛出并捕获异常是否安全,或者应用程序在第二次抛出时调用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)?

2 个答案:

答案 0 :(得分:4)

在堆栈展开期间并不是这样。输入一个catch块后,堆栈已经解开。

是的,该代码是合法的。请参阅此问题:Nested try...catch inside C++ exception handler?

答案 1 :(得分:2)

Pubby的答案最能回答您所描述的情景。

作为附录,当堆栈正在展开时,执行的唯一用户代码是析构函数(以及析构函数调用的代码)。

如果您在此方案中在析构函数中执行 throw,则该标准会指定将调用std::terminate()