1、考虑一个类Widget,析构方法抛出异常,一个集合中包含10个Widget对象,集合离开作用域,逆序撤销集合里的对象,最后一个抛出异常,倒数第二个抛出异常,问题出现了,这种情况下,要么导致程序结束,要么导致不明确行为。
2、因此,绝不能在析构方法中抛出异常。考虑,数据库连接类DBConn,用户可能会忘记关闭连接,因此在DBConn的析构方法中,执行Close方法。那么问题来了,close方法可能会抛出异常,怎么办?
a、在析构方法中,捕获异常,结束程序,这种方法可用性太差。
b、在析构方法中,捕获异常,吐下异常,这种方法忽略错误,程序继续运行,接下来可能会导致不明确行为。
3、上面两种解决办法都不好,有没有更好的办法呢?
设计异常的目的就是,将问题检测和问题处理分离。显然,DBConn不知道怎么处理问题(结束程序和吐下异常都不合适),那就应该抛出去,让用户处理。既然Close方法可能有异常,而析构方法抛出异常总是危险,更好的解决办法,暴露Close方法,让用户决定怎么处理异常。同时,在析构方法中,再做一次检查。