【问题标题】:Should I add throw() to the declarations for my C++ destructors?我应该将 throw() 添加到我的 C++ 析构函数的声明中吗?
【发布时间】:2010-10-02 04:29:32
【问题描述】:

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

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

这是个好主意吗?

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

参考:this recent question

【问题讨论】:

    标签: c++ exception destructor


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-09-25
        • 2014-03-05
        • 1970-01-01
        • 2016-09-24
        • 1970-01-01
        • 1970-01-01
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多