声明:
- 文中内容收集整理自《Effective C++(中文版)第三版》,版权归原书所有。
- 本内容在作者现有能力的基础上有所删减,另加入部分作者自己的理解,有纰漏之处敬请指正。
条款08:别让异常逃离析构函数
Prevent exceptions from leaving destructors.
直接进入正题。
C++不喜欢析构函数吐出异常!
如果程序遭遇一个“于析构期间发生的错误”,后无法继续执行,“强迫结束程序”是个合理选项,这样可以阻止异常从析构函数传播出去。也就是说调用abort可以抢先置“不明确行为”于死地。
class DBCoon
{
public:
...
//class提供一个普通函数而非析构函数
void close()
{
db.close();
closed = true;
}
//析构函数中的双保险
~DBconn()
{
if(!closed)
try
{
db.close();
}
catch(...)
{
//制作运转记录,记下对close的调用失败
}
}
private:
DBConnection db;
bool closed;
};
DBconn::~DBconn()
{
//关闭连接,如果客户不那么做的话
try
{
db.close();
}
catch(...)
{
//制作运转记录,记下对close的调用失败
std::abort(); //程序终止
}
}
请记住:
析构函数绝不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们或结束程序。
如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。