首页 > 代码库 > Effective C++ 条款八 别让异常逃离析构函数

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
 
      }
  };
<style type="text/css">.csharpcode, .csharpcode pre{ font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em;}.csharpcode .lnum { color: #606060; }</style>

 

记住:

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

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