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

本文探讨了在C++中如何正确地处理析构函数中的异常问题,提出了几种避免异常传播的方法,包括尝试捕获异常并终止程序或忽略异常,以及将资源释放的责任移交给类的使用者。

记住:
析构函数不要抛出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕捉任何异常,忽悠异常或者结束程序。
如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么class应该提供一个普通函数执行该操作。

class DBConn {
public:
    ...
    ~DBConn()            //确保数据库连接总是被关闭
    {
        db.close();
    }
private:
    DBConnection db;
};

如果db.close()抛出异常,可能会造成麻烦。

解决办法

DBConn::~DBConn()
{
    try { db.close(); }
    catch (...) {
        //记录下close的调用失败
        std::abort();
    }
}

或者忽略失败

DBConn::~DBConn()
{
    try { db.close(); }
    catch (...) {
        //记录下close的调用失败
    }
}

比较好的方式是把close的责任从DBConn析构函数移到DBConn的客户手上。

class DBConn {
public:
    ...
    void close()
    {
        db.close();
        closed = true;
    }
    ~DBConn()        
    {
        if (!closed) {
            try {
                db.close();
            }
            catch (...) {
                //记录下close的调用失败
                ...
            }
        }
    }
private:
    DBConnection db;
    bool closed;
};

 

转载于:https://www.cnblogs.com/pfsi/p/9169351.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值