【发布时间】:2010-10-02 04:29:32
【问题描述】:
我见过一些 C++ 类的析构函数定义如下:
class someClass
{
public:
someClass();
~someClass() throw();
};
这是个好主意吗?
我很清楚析构函数永远不应该抛出异常,但这真的会阻止我在析构函数中抛出异常吗?我不能 100% 确定它保证了什么。
【问题讨论】:
标签: c++ exception destructor
我见过一些 C++ 类的析构函数定义如下:
class someClass
{
public:
someClass();
~someClass() throw();
};
这是个好主意吗?
我很清楚析构函数永远不应该抛出异常,但这真的会阻止我在析构函数中抛出异常吗?我不能 100% 确定它保证了什么。
【问题讨论】:
标签: c++ exception destructor
这不是一个糟糕的主意。如果您在没有传播异常的情况下抛出 dtor,您将立即中止,这让您知道您忘记了创建一个实际的非抛出 dtor。
另一方面,如果您将 throw 规范排除在外,那么您只会在实际上抛出异常时才知道错误的 dtor 实现。
【讨论】:
它不会阻止您从析构函数中抛出异常。编译器仍然会让你这样做。不同之处在于如果您确实允许异常从该析构函数中逃脱,您的程序将立即调用unexpected。该函数调用unexpected_handler 指向的任何内容,默认情况下为terminate。因此,除非您采取措施来处理意外异常,否则您的程序将终止,这完全不是一个坏主意。毕竟,如果异常真的是意料之外的,那么你的程序无论如何也无法处理它。
这并不是析构函数的特殊之处;相同的规则适用于所有方法的异常规范。
【讨论】: