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

版权声明:本文为博主原创文章,转载请注明出处并附带本文链接。 https://blog.csdn.net/IOT_Flower/article/details/78626166

不要让异常出现在析构函数里,如果是析构函数中调用的函数导致的异常,应在析构函数中对异常作出处理(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;
}


猜你喜欢

转载自blog.csdn.net/IOT_Flower/article/details/78626166