当析构函数要执行一个动作,而该动作可能会因为失败会抛出异常,考虑下面的例子。
class DBConnection
{
public:
static DBConnection create()
{
}
void close()
{
}
};
class DBConn
{
public:
~DBConn()//在析构函数中关闭联机
{
db.close();
}
private:
DBConnection db;
};
①如果close抛出异常就结束程序,阻止异常从析构函数逃离出去
~DBConn()
{
try
{
db.close();
}
catch(...)
{
abort();
}
}
②吞下close发生的异常
~DBConn()
{
try
{
db.close();
}
catch(...)
{
}
}
③上面两种情况无法对异常进行处理,所以可以重新设计DBConn接口,让客户有机会处理“因该操作发生的异常”。
class DBConn
{
public:
void close() //供客户使用的函数
{
db.close();
closed = true;
}
~DBConn()
{
if (!closed)
{
try
{
db.close();
}
catch (...)
{
}
}
}
private:
DBConnection db;
bool closed;
};