条款08:别让异常逃离析构函数

在C++中,在销毁每个对象时调用析构函数,而在析构期间,如果有异常被抛出,如果在两个异常同时存在的情况下,程序若不是结束执行就是导致不明确的行为。

 

例如:

class DBConnection

{

public:

    ........

    static DBConnection create();

 

    void close();

};

 

class DBConn

{

public:

    ........

    ~DBConn()

    {

        db.close();

    }

private:

    DBConnection db;

};

 

DBConn dbc(DBConnection::create());

如果该调用导致异常,DBConn析构函数会传播该异常,导致难以驾驭的麻烦。

    书中给出了两种解决办法:

    1.调用abort

DBConn::~DBConn()

{

    try { db.close() ;}

    catch(....)

    {

        制作运转记录,记下对close的调用失败;

        std::abort();         //使程序直接终止

    }

}

    2.吞下因调用close而产生的异常

DBConn::~DBConn()

{

    try { db.close() ;}

    catch(....)

    {

         制作运转记录,记下对close的调用失败;

    }

}

两种办法都无法对产生的异常做出反应,因此重新设计DBConn类

class DBConn

{

public:

    ....

    void close()            //客户使用该关闭函数

    {

         db.close();

         closed = true;

    }

    ~DBConn()

    {

        if(!closed)                  //如果客户没有执行close函数,则析构函数里要执行

        {

                try { db.closed() ; }

                catch(......)

                {

                       制作运转记录,记下对close的调用失败;

                }

        }

    }

private:

    DBConnection db;

    bool closed;

};

 

你可能感兴趣的:(条款08:别让异常逃离析构函数)