条款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;

};

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值