Item 8:别让异常逃离析构函数【effective C++读书笔记】

来源:互联网 发布:一起牛软件下载 编辑:程序博客网 时间:2024/05/18 01:03

不要让异常出现在析构函数里,如果是析构函数中调用的函数导致的异常,应在析构函数中对异常作出处理(try,catch),吞下异常(不传播)或结束程序。举例中close()是需要调用的函数。

                                            

①  如果程序遭遇一个“于析构期间发生的错误”后无法继续执行,“强迫结束程序”是个合理选项,毕竟它可以阻止异常从析构函数中传播出去。如果想要抛出异常后结束,通常通过调用abort完成:

A::~A(){        try{   close();        }        catch(…){//记录调用失败   std::abort();        }}

②一般来说将异常吞掉是个坏主意,但有时候也比草率结束程序或者导致不明确行为要好。如果想要吞下异常:

A::~A(){try{           close();        }        catch(…){//记录调用失败        }}

③以上两种方法都没办法对可能出现的问题作出处理,因此最佳的策略是重新设计接口,让用户可以自行对程序运行期间抛出的异常进行处理,当用户没有处理的时候才调用析构函数里的函数。那么类中应该提供一个普通的函数(非析构函数)执行该操作:

class A{public:void func(){close();closed=true;}        ~A()        {     if(!closed)    {        try{  close();        }        catch(…){        //记录调用失败        }           }       }private:bool closed;}


阅读全文
0 0
原创粉丝点击