Effective C++ 条款八 别让异常逃离析构函数

  class DBConn //这个class用来管理DBConnction对象
  {
  public:
 
      //自己设计一个新的DBConn接口   方法3
      void close()
      {
          db.close();
          closed = true;
      }
 
 
      ~DBConn() //确保数据库连接总是会被关闭
      {
         //db.close();
 
          if (!closed)
          {
              try
              {
                  db.close();
              }
              catch()
              {
                   //制作运转记录,记下对close的调用失
              }
          }
      }
  protected:
  private:
      DBconnection db;
      bool closed;
  };
 
  //假如调用析构函数发送错误,导致异常。析构函数会传播该异常,这时该怎么办?
  //
 
  DBConn::~DBConn
  {
      try 
      {
          db.close();
      }
      catch ()
      {
          //制作运转记录,记下对close的调用失败   方法1
         // abort(); //终止某个进程               方法2
 
      }
  };

记住:

         1析构函数绝对不要吐出异常。如果一个被析构的函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,然后吐下他们或结束程序。

      2、如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数(不是在析构函数中)执行该操作。

原文地址:https://www.cnblogs.com/zhuxuekui/p/3915344.html