在C++中,在销毁每个对象时调用析构函数,而在析构期间,如果有异常被抛出,如果在两个异常同时存在的情况下,程序若不是结束执行就是导致不明确的行为。
例如:
class DBConnection
{
public:
........
static DBConnection create();
void close();
};
class DBConn
{
public:
........
~DBConn()
{
db.close();
}
private:
DBConnection db;
};
DBConn dbc(DBConnection::create());
如果该调用导致异常,DBConn析构函数会传播该异常,导致难以驾驭的麻烦。
书中给出了两种解决办法:
1.调用abort
DBConn::~DBConn()
{
try { db.close() ;}
catch(....)
{
制作运转记录,记下对close的调用失败;
std::abort(); //使程序直接终止
}
}
2.吞下因调用close而产生的异常
DBConn::~DBConn()
{
try { db.close() ;}
catch(....)
{
制作运转记录,记下对close的调用失败;
}
}
两种办法都无法对产生的异常做出反应,因此重新设计DBConn类
class DBConn
{
public:
....
void close() //客户使用该关闭函数
{
db.close();
closed = true;
}
~DBConn()
{
if(!closed) //如果客户没有执行close函数,则析构函数里要执行
{
try { db.closed() ; }
catch(......)
{
制作运转记录,记下对close的调用失败;
}
}
}
private:
DBConnection db;
bool closed;
};