1

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

读完这个问题后我很好奇。

注意:我知道你可以/应该在析构函数中,但是在一个块catch(...)中通常有 a 是否有意义- 也许在某个调用异常的函数中(在我的示例中)?try/catchcatchre

4

2 回答 2

5

这并不是在堆栈展开期间。一旦进入一个 catch 块,堆栈就已经被展开。

是的,该代码是合法的。看到这个问题:Nested try...catch inside C++ exception handler?

于 2013-03-19T19:24:24.283 回答
2

Pubby 的回答最好地回答了您所描述的场景。

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

如果您 throw这种情况下使用析构函数,则标准指定std::terminate()将调用该析构函数。

于 2013-03-19T19:29:09.597 回答