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