在析构函数里面抛出异常是不好的:
class Widget{
public:
…
~Widget(){…}
};
void doSomething()
{
std::vectorv;
… //v这里被自动销毁
}
当v被销毁,里面的widget会被销毁,当第一个widget被销毁时抛出异常,其他的纠葛widget还是应该被销毁,不然容易内存泄漏,当第二个widget销毁时又抛出异常,那么系统无法忍受这么多的异常,程序不是立马结束就是导致不明确行为,所以后面的八个widget可能不会被析构。于是,C++不喜欢析构函数突出异常。
解决办法:
1.当出现异常时,直接使用std::abort()结束程序。
DBConn::~DBConn()
{
try{db.close();}
catch(...)
{
std::abort();
}
}
这样会在不明确情况出现前终止程序,但是这样太过于武断,也不是很好。
2.另一种方法是将选择权抛给用户。
所以当析构函数出现异常,要么吞下他们(不传播)或结束程序,要么就不要在析构函数中吐出异常。