我是 C++ 新手,对以下问题有些困惑:
当 DTOR 抛出异常时会发生什么?对象还在被破坏吗?
提前致谢。
一般来说:这是一个坏主意吗?
是的,一个非常糟糕的。
不要从析构函数中抛出异常。如果在引发另一个异常之后又引发了一个异常,但在该异常被catch
处理程序捕获之前,您的程序将被迫突然终止。
由于在抛出异常时在堆栈展开期间调用析构函数,如果其中一个抛出另一个异常,那将立即终止您的程序。不太好。
避免从析构函数中抛出异常(或将它们包装到try
/catch
块中,以免将它们传播到析构函数之外)。这样做是一种糟糕的编程习惯。
来自 C++11 标准的第 15.2/3 段:
为在从 try 块到引发异常的点的路径上构造的自动对象调用析构函数的过程称为“堆栈展开”。如果在堆栈展开期间调用的析构函数以异常退出,则调用 std::terminate (15.5.1)。[注意:所以析构函数通常应该捕获异常,而不是让它们传播到析构函数之外。——尾注]
是的,这是个坏主意。没有合理的方法来确定您是否可以安全地投掷。