C++并不禁止析构函数吐出异常,但是它不鼓励这样做
class Widget
{
public:
~Widget()
{
throw 20;
};
};
vector<Widget>vec;
当vec被销毁时,他有责任销毁其内含的所有Widget
如果vec内含10个Widget,在析构第一个元素期间,有个异常被抛出,其他9个Widget还是应该被销毁,否则他们保存的资源都会发生泄漏
当碰到析构函数需要抛出异常时的解决方法:
(关于数据库操作的类)
class DBCon
{
public:
~DBCon()
{
try
{
db.close();
}
catch
{
abort();
//强制结束程序
}
};
private:
DBConnection db;
};
class DBCon
{
public:
~DBCon()
{
try
{
db.close();
}
catch
{
//输出错误信息,记录下来
}
};
private:
DBConnection db;
};
更好的解决方法是重新设计接口
class DBCon
{
public:
void close()
{
db.close();
closed = true;
}
~DBCon()
{
if(!close)
{
try
{
db.close();
}
catch
{
//输出错误信息,记录下来
}
}
};
private:
DBConnection db;
bool closed;
};