Effective c++ 条款8 别让异常逃离析构函数
作者:互联网
-
c++并不禁止析构函数吐出异常,但不鼓励这样做
-
问题:若两个异常同时存在,程序不是结束执行就是导致不明确行为
class A { public: ··· ~A(){...} //可能抛出一个异常 } void doSomething() { std::vector<A>v; } //v在这被自动销毁并有责任销毁其内含的对象,如果v含有十个A,前两个A销毁时都抛出异常,会导致不明确行为
-
解决方案一:
-
若析构函数抛出异常,就调用abort(阻止异常传播)
A::~A() { try{ a.close();} catch(...) { //制作运转记录,记录对close的调用失败 std::abort; } }
-
-
解决方案二:
-
吞下异常
A::~A() { catch(...) { //制作运转记录,记录对close的调用失败 } }
-
-
解决方案三:
-
让客户有机会对异常做出处理并且也包含方案一
class A { public: void close() { a.close(); closed = true; } ~A() { if( !closed ) try{ a.close();} catch(...) { //制作运转记录,记录对close的调用失败 std::abort; } } private: bool closed; }
-
标签:...,closed,Effective,记录,c++,abort,析构,close,异常 来源: https://www.cnblogs.com/chenglixue/p/16389728.html