条款八:别让异常逃离析构函数
异常判断是与C语言不同一个功能,带来方便的同时也会带来一些问题,例如:
class widget{ public: .... ~widget(){} }; void doSomething(){ std::vecotr<widget> v; ..... }
在doSomething的函数结束的时候,vector中的对象会对应的调用widget类的析构函数,如果此时有100个成员,在调用
的对应成员的析构函数的时候如果出现了多次的析构异常,那么此时程序就可能会异常的停止或者出现不确定的情况,为了阻止
这种情况出现一个原则就是:不要让析构函数出现异常!
为了防止在析构函数中出现异常,主要有以下的几种方法:
1.在可能造成异常的代码中做异常的判断,捕获异常后,要么终止程序的执行,要么就是吞下异常,让程序继续执行,
例如:
DBConn::~DBConn(){ try{ db.close(); }catch(...){ std::abort(); } }
DBConn::~DBConn(){ try{ db.close(); }catch(...){ } }
2.将可能造成异常的代码放到一个独立的函数中,然后在析构的时候提前调用,这样能提前发现异常并做处理,具体的例
子请参看书
请记住:
- 虚构函数不要出现异常,如果一个被析构函数调用的函数中出现了异常,则要么结束程序要么就吞下异常!
- 如果客户需要对一个运行期间出现异常的函数做出反应,那么应该提供一个独立的函数而非析构函数来执行此操作!