6

我见过一些 C++ 类的析构函数定义如下:

class someClass
{
    public:
        someClass();
        ~someClass() throw();
};

这是一个好主意吗?

我很清楚析构函数永远不应该抛出异常,但这实际上会阻止我在析构函数中抛出异常吗?我不是 100% 确定它保证了什么。

参考:这个最近的问题

4

2 回答 2

7

它不会阻止您从析构函数中抛出异常。编译器仍然会让你这样做。不同之处在于,如果您确实允许从该析构函数中逃脱异常,您的程序将立即调用unexpected. 该函数调用任何unexpected_handler指向,默认情况下是terminate. 因此,除非您采取措施处理意外异常,否则您的程序将终止,这完全不是一个坏主意。毕竟,如果异常确实出乎意料,那么您的程序无论如何也无法处理它。

这对于析构函数来说并没有什么特别之处。相同的规则适用于所有方法的异常规范。

于 2009-01-19T06:49:34.473 回答
3

这不是一个糟糕的主意。如果您在没有传播异常的情况下抛出 dtor,您将立即中止,这让您知道您忘记了创建一个实际的非抛出 dtor。

另一方面,如果您将 throw 规范排除在外,那么您只会在实际上抛出异常时才知道错误的 dtor 实现。

于 2009-01-19T06:48:50.230 回答