条款08:别让异常逃离析构函数

结论1:析构函数绝对不要吐了异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吞下它们(不传播)或结束程序。

C++并不禁止析构函数吐出异常,但不鼓励这样做,只要析构函数吐出异常,程序可能过早结束或出现不明确行为。

两种避免析构函数吐出异常的方法:

例如: 

class DBConnection {//负责数据库连接的class
public:
static DBConnection create();//返回DBConnection对象
void close();//关闭联机,失败则抛出异常
};
class DBConn {//管理DBConnection对象的class
public:
~DBConn() {//确保数据库连接总被关闭
db.close();
} 
private:
DBConnection db;
};

方法一:如果close抛出异常,直接结束程序,则需要修改DBConn的析构函数为

DBConn::~DBConn() {
try {db.close()}
catch(...) {
std::abort();
}
}

方法二:吞下因调用close而发生的异常

DBConn::~DBConn() {
try {db.close();}
catch(...) {
}
}

结论2:如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(而非在析构函数中)执行该操作。

例如:上述例子中的close()函数可由客户调用,让客户有一个机会得以处理”因该操作而发生的异常”。

class DBConn {
public:
void close() {
db.close(); //供客户调用的新函数
closed = true;
}
~DBConn(){
if (!closed) {
try { db.close() }
catch (...) { }
}
}
private:
DBConnection db;
bool closed;
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值