Chinaunix首页 | 论坛 | 博客
  • 博客访问: 308731
  • 博文数量: 94
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 202
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-08 20:07
文章分类

全部博文(94)

文章存档

2017年(19)

2016年(30)

2015年(12)

2014年(33)

我的朋友

分类: LINUX

2017-05-12 11:12:30

当在析构函数需要执行某个动作,但该动作可能失败并抛出异常,例如意见管理数据库连接的类:

点击(此处)折叠或打开

  1. class DBConnection {
  2. public:
  3.     ...
  4.     static DBConnection create();
  5.     ...
  6.     void close();
  7. };
通常为确保客户不忘记关闭连接,在析构函数中调用close。

点击(此处)折叠或打开

  1. class DBConnection {
  2. public:
  3.     ...
  4.     static DBConnection create();
  5.     ...
  6.     void close();
  7.     ~DBConnection()
  8.     {
  9.         db.close();
  10.     }
  11. private:
  12.     DBConnection db;
  13. };

但如果在析构函数调用close过程中出现异常,通常是abort结束进程,或者记录异常并吞下异常。

点击(此处)折叠或打开

  1. DBConnection::~DBConnection()
  2. {
  3.     try {
  4.         db.close();
  5.     } catch (...) {
  6.         //记录close调用失败
  7.         std::abort();
  8.     }
  9. }


一个比较好的设计是,提供客户主动处理异常的机会,并追加记录连接是否关闭的管理,若没有关闭在析构函数中将之关闭。

点击(此处)折叠或打开

  1. class DBConn {
  2. public:
  3.     ...
  4.     void close()
  5.     {
  6.         db.close();
  7.         closed = TRUE;
  8.     }
  9.     ~DBConn()
  10.     {
  11.         if (!closed) {
  12.             try {
  13.                 db.close();
  14.             } catch (...) {
  15.                 //exception handle
  16.                 std::abort();
  17.             }
  18.         }
  19.     }
  20. private:
  21.     DBConn db;
  22.     Boolean closed;
  23. };
阅读(1372) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~