c++ 在堆栈展开时抛出/捕获安全吗?

vjrehmav  于 2023-03-05  发布在  其他
关注(0)|答案(2)|浏览(114)

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

wmtdaxz3

wmtdaxz31#

这并不是真的在堆栈解卷期间,一旦进入catch块,堆栈就已经被解卷了。
是的,这个代码是法律的的。看这个问题:Nested try...catch inside C++ exception handler?

6ojccjat

6ojccjat2#

Pubby的答案最好地回答了你所描述的场景。
作为补充,当堆栈展开时,唯一执行的用户代码是析构函数(以及这些析构函数调用的代码)。
如果您在此场景中在析构函数中执行throw(并且不在同一析构函数中捕获异常),则标准指定将调用std::terminate()

相关问题