class D
{
public:
    ~D() { throw std::exception(); }
};
int main()
{
    try
    {
        try
        {
            D d;
        }
        catch (...)
        {
            cout << "1";
        }
    }
    catch (std::exception& e)
    {
        cout << "2";
    }
}

我的轻描淡写是,这应该在2中捕获。但是它没有捕获,而是终止了程序。

最佳答案

在C++ 11中,析构函数是隐式的noexcept,因此,如果析构函数抛出未在析构函数本身内捕获的异常,则会自动调用std::terminate

甚至在此之前,在堆栈展开过程中抛出未捕获的异常的析构函数会导致std::terminate的调用,因此,如果析构函数被使气泡冒泡的其他异常调用,则您正在执行的操作将无效。

如果这无关紧要,则可以将析构函数显式声明为~D() noexcept(false)(如果析构函数不是由引起堆栈展开的其他异常触发的,则允许异常冒泡从析构函数中冒出来)。

请注意,尽管从技术上讲这是合法的,但在析构函数中引发未捕获的异常通常被认为是一个坏主意,因为这会使您的类在可能引发可处理异常的任何情况下基本上都无法使用。您可以在c++ exception in destructor上阅读更多内容(这不是严格的副本,但完全涵盖了您的情况)。

关于c++ - 为什么我的析构函数异常没有被捕获,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57464580/

10-13 07:27