别让异常逃离析构函数
如果异常逃离析构函数,如果有class widgets,我们有vector<widgets> d 如果d离开其作用域 并且widgets的析构函数抛出异常,那么就会连续的抛出异常。导致程序结束和不明确行为,处理的方法最佳是提供一个函数,让用户有机会去处理异常,如果用户没有处理该异常,那么在析构函数中我们就需要吞掉异常或者是捕获异常,让程序提前结束,避免不明确的行为。
class DBConn
{
public:
void close()
{
db.close()
closed=true;
}
~DBConn()
{
if(!closed)
{
try
{
db.close()
}
catch(...)
{
//打日志,或者提前结束程序
}
}
}
private:
DBConn db;
bool closed;
}
close()是提供给客户的函数,让客户有机会处理异常,如果用户自己未处理,那么我们就就在析构函数中处理,但我们给了机会给客户处理可能抛出异常代码的机会。