jake1036

析构函数与异常

         析构函数与异常

在析构函数中抛出异常,可能会造成程序的崩溃或者其他不明确行为。
  如下在一个数据库连接的类中在析构函数中,对数据库连接进行关闭操作。
  class DBConn
  {
      public : 
         ~DBConn()
           {
              db.close() ;
          }
         
       private :
          DBConnection db ;
 
  }

  如果调用close方法发生了错误,就会造成异常被传播,意味着异常可以离开这个析构函数,会带来难以驾驭的麻烦。

2 使用abort 在析构函数中,进行捕捉

     DBConn::~DBConn()
     {
        try{
           db.close() ;
        } catch()
       {
          abort() ;
     }
   }
   通过上述这种方法,可以阻止异常从析构函数中传播。一般而言,吞掉一个异常并不是个好办法。

 3 比较好的办法
    可以改变一下类的接口,使客户有机会对可能发生的异常做出反应。
    class DBConn
    {
        public : 
          void close()
           { 
              db.close() ;
              closed = true ;
           }

          ~DBConn()
          {
              if(!closed)
               try{
                    db.close() ;
                } catch()
                {
                }

         }

         private :
           DBConnection db ;
           bool closed ;
   }


四 总结:
    (1) 析构函数绝对不允许抛出异常,如果一个析构函数中需要有异常处理,那么就应该对该异常进行捕捉,
          而不应该使异常得以传播。
    (2) 如果客户需要对某一个异常做出反应,那么就需要在接口中提供一个普通函数,而不应该使析构函数中处理该异常。





posted on 2011-05-03 17:14 kahn 阅读(354) 评论(0)  编辑 收藏 引用 所属分类: c++学习总结


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理