1. 程式人生 > >條款8:不能讓異常逃離解構函式,否則難以想象

條款8:不能讓異常逃離解構函式,否則難以想象

1、c++並不禁止解構函式吐出異常,但它不鼓勵你這樣做。

例:vector存的結構是class的話,當vector被銷燬時,如果兩個class在析構的時候丟擲異常,程式若不是結束執行就是導致不明確行為。

2、如果解構函式必須執行一個動作,該動作可能會失敗丟擲異常,該怎麼辦?

(1)如果丟擲異常,通過呼叫abort直接結束程式;

     try {

       db.close();   //失敗了可能丟擲異常

}

     catch ( ){

       //記錄;

       std::abort();

}

(2)吞下發生的異常。

     try {

       db.close();   //失敗了可能丟擲異常

}

     catch ( ){

       //記錄;

}

(2

3、如果需要對某個操作函式執行期間丟擲的異常做出反應,那麼class應該提供一個普通函式(而非在解構函式中)執行該操作。

class DBConn{

public:

      void close(){

             db.close();

             closed = true;

      }

~DBConn(){

        if(!closed){

               try {

                          db.close();

                     }

              catch (){

                      //記錄,並結束程式或者吞下異常;

                      }

             }

       }

private :

         BDConection db;

         bool closed;

};