我应该将throw()添加到我的C ++析构函数的声明中吗?

时间:2009-01-19 06:42:08

标签: c++ exception destructor

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

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

这是个好主意吗?

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

参考:this recent question

2 个答案:

答案 0 :(得分:7)

它不会阻止您从析构函数中抛出异常。编译器仍然允许你这样做。不同之处在于如果允许异常从析构函数中逃脱,程序将立即调用unexpected。该函数调用unexpected_handler个点,默认为terminate。因此,除非你做一些事情来处理意外的异常,否则你的程序会终止,这并不是一个坏主意。毕竟,如果异常真的是意料之外的话,那么你的程序无论如何都无法处理它。

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

答案 1 :(得分:3)

这不是一个糟糕的主意。如果您在没有异常传播的情况下投掷dtor,您将立即中止,这会让您知道您忘记制作一个真正的非投掷dtor。

如果另一方面你抛弃了抛出规范,那么当实际抛出异常时,你只会知道你的糟糕的dtor实现。