问题:
因为析构函数通常干的事情都是清理释放对象持有的资源。如果在析构的过程中发生了异常就可能会导致资源泄露,导致程序出现不明确的行为
解决方式:
(1)在析构函数中加上异常捕获的代码,析构函数中可能出现异常的部分。当出现异常的时候,使用abort来强迫终止程序,这样可以阻止异常从析构函数中传递出去,如果传递出去可能会导致不明确的行为。也就是说使用abort可以抢先不明确的行为与死地。
(2)在析构函数中捕获异常,但是不强迫终止程序,默默地吞下异常。这种方案可以保证程序能够继续执行,有时候比草率的结束程序要好一些
(3)另外一种方式可以设计一个接口给用户,另外加一个调用标志isused。这个提供给用户的结构实际上可以完成析构清理资源,关闭数据库连接等的操作。用户在他们的代码中可以使用try-catch异常不活的语句来处理这个可能处理异常的部分,如果调用了接口,在接口代码中设置isused=true。并且在析构函数中检查接口是否被调用的标志,如果接口没有被用户显示的调用,在析构函数中就执行那部分可能会出异常的部分,同样,在析构函数中处理的时候也是要加上try-catch来处理异常,防止因为发生异常,传递出去导致程序不明确的行为。
总结:
(1)析构函数绝对不要吐出异常。如果一个析构函数可能会导致异常,应该在析构函数中捕获这个异常,吞下异常或者是终止程序。
(2)如果客户需要对某个操作函数运行期间可能出现的异常作出反应,那么class应该提供一个普通函数的接口来给用户执行操作,方便用户捕获可能出现的异常。