zoukankan      html  css  js  c++  java
  • 【08】别让异常逃离析构函数

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

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

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

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

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

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

  • 相关阅读:
    条件编译
    宏定义
    联合体,枚举类型
    结构体的概念
    C#程序报找不到时区错误
    C# ArrayList和List的区别
    C# 无法将类型为“__DynamicallyInvokableAttribute”的对象强制转换为类型...
    C# readonly与const区别
    C#特性
    Linux vsftpd 安装配置使用
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3523158.html
Copyright © 2011-2022 走看看