析构函数与异常
在析构函数中抛出异常,可能会造成程序的崩溃或者其他不明确行为。
如下在一个数据库连接的类中在析构函数中,对数据库连接进行关闭操作。
class DBConn
{
public :
~DBConn()
{
db.close() ;
}
private :
DBConnection db ;
}
如果调用close方法发生了错误,就会造成异常被传播,意味着异常可以离开这个析构函数,会带来难以驾驭的麻烦。
2 使用abort 在析构函数中,进行捕捉
DBConn::~DBConn()
{
try{
db.close() ;
} catch()
{
abort() ;
}
}
通过上述这种方法,可以阻止异常从析构函数中传播。一般而言,吞掉一个异常并不是个好办法。
3 比较好的办法
可以改变一下类的接口,使客户有机会对可能发生的异常做出反应。
class DBConn
{
public :
void close()
{
db.close() ;
closed = true ;
}
~DBConn()
{
if(!closed)
try{
db.close() ;
} catch()
{
}
}
private :
DBConnection db ;
bool closed ;
}
四 总结:
(1) 析构函数绝对不允许抛出异常,如果一个析构函数中需要有异常处理,那么就应该对该异常进行捕捉,
而不应该使异常得以传播。
(2) 如果客户需要对某一个异常做出反应,那么就需要在接口中提供一个普通函数,而不应该使析构函数中处理该异常。