当在析构函数需要执行某个动作,但该动作可能失败并抛出异常,例如意见管理数据库连接的类:
-
class DBConnection {
-
public:
-
...
-
static DBConnection create();
-
...
-
void close();
-
};
通常为确保客户不忘记关闭连接,在析构函数中调用close。
-
class DBConnection {
-
public:
-
...
-
static DBConnection create();
-
...
-
void close();
-
~DBConnection()
-
{
-
db.close();
-
}
-
private:
-
DBConnection db;
-
};
但如果在析构函数调用close过程中出现异常,通常是abort结束进程,或者记录异常并吞下异常。
-
DBConnection::~DBConnection()
-
{
-
try {
-
db.close();
-
} catch (...) {
-
//记录close调用失败
-
std::abort();
-
}
-
}
一个比较好的设计是,提供客户主动处理异常的机会,并追加记录连接是否关闭的管理,若没有关闭在析构函数中将之关闭。
-
class DBConn {
-
public:
-
...
-
void close()
-
{
-
db.close();
-
closed = TRUE;
-
}
-
~DBConn()
-
{
-
if (!closed) {
-
try {
-
db.close();
-
} catch (...) {
-
//exception handle
-
std::abort();
-
}
-
}
-
}
-
private:
-
DBConn db;
-
Boolean closed;
-
};
阅读(1372) | 评论(0) | 转发(0) |