条款08 别让异常逃离析构函数

问题:

因为析构函数通常干的事情都是清理释放对象持有的资源。如果在析构的过程中发生了异常就可能会导致资源泄露,导致程序出现不明确的行为

解决方式:

(1)在析构函数中加上异常捕获的代码,析构函数中可能出现异常的部分。当出现异常的时候,使用abort来强迫终止程序,这样可以阻止异常从析构函数中传递出去,如果传递出去可能会导致不明确的行为。也就是说使用abort可以抢先不明确的行为与死地。

(2)在析构函数中捕获异常,但是不强迫终止程序,默默地吞下异常。这种方案可以保证程序能够继续执行,有时候比草率的结束程序要好一些

(3)另外一种方式可以设计一个接口给用户,另外加一个调用标志isused。这个提供给用户的结构实际上可以完成析构清理资源,关闭数据库连接等的操作。用户在他们的代码中可以使用try-catch异常不活的语句来处理这个可能处理异常的部分,如果调用了接口,在接口代码中设置isused=true。并且在析构函数中检查接口是否被调用的标志,如果接口没有被用户显示的调用,在析构函数中就执行那部分可能会出异常的部分,同样,在析构函数中处理的时候也是要加上try-catch来处理异常,防止因为发生异常,传递出去导致程序不明确的行为。


总结:

(1)析构函数绝对不要吐出异常。如果一个析构函数可能会导致异常,应该在析构函数中捕获这个异常,吞下异常或者是终止程序。

(2)如果客户需要对某个操作函数运行期间可能出现的异常作出反应,那么class应该提供一个普通函数的接口来给用户执行操作,方便用户捕获可能出现的异常。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值