【08】别让异常逃离析构函数

探讨析构方法中抛出异常的问题,以Widget类和DBConn类为例,分析在析构过程中异常处理的困境,提出避免在析构方法中抛出异常的建议,并讨论如何通过暴露Close方法让用户自行处理潜在异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、考虑一个类Widget,析构方法抛出异常,一个集合中包含10个Widget对象,集合离开作用域,逆序撤销集合里的对象,最后一个抛出异常,倒数第二个抛出异常,问题出现了,这种情况下,要么导致程序结束,要么导致不明确行为。

2、因此,绝不能在析构方法中抛出异常。考虑,数据库连接类DBConn,用户可能会忘记关闭连接,因此在DBConn的析构方法中,执行Close方法。那么问题来了,close方法可能会抛出异常,怎么办?

  a、在析构方法中,捕获异常,结束程序,这种方法可用性太差。

  b、在析构方法中,捕获异常,吞下异常,这种方法忽略错误,程序继续运行,接下来可能会导致不明确行为。

3、上面两种解决办法都不好,有没有更好的办法呢?

  设计异常的目的就是,将问题检测和问题处理分离。显然,DBConn不知道怎么处理问题(结束程序和吞下异常都不合适),那就应该抛出去,让用户处理。既然Close方法可能有异常,而析构方法抛出异常总是危险,更好的解决办法,暴露Close方法,让用户决定怎么处理异常。同时,在析构方法中,再做一次检查。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值