zoukankan      html  css  js  c++  java
  • Effective C++ 笔记 —— Item 8: Prevent exceptions from leaving destructors.

    Destructors should never emit exceptions. If functions called in a destructor may throw, the destructor should catch any exceptions, then swallow them or terminate the program.

    1. Terminate the program if close throws, typically by calling abort:

    DBConn::~DBConn()
    {
        try 
        {
            db.close(); 
        }
        catch (...) {
            // make log entry that the call to close failed;
            std::abort();
        }
    }

    2. Swallow the exception arising from the call to close:

    DBConn::~DBConn()
    {
        try 
        { 
            db.close(); 
        }
        catch (...) {
            //make log entry that the call to close failed;
        }
    }

    If class clients need to be able to react to exceptions thrown during an operation, the class should provide a regular (i.e., non-destructor) function that performs the operation.

    class DBConn {
    public:
        // ...
        void close() // new function for
        { 
            // client use
            db.close();
            closed = true;
        }
        ~DBConn()
        {
            if (!closed) 
            {
                try 
                { 
                    // close the connection
                    db.close(); // if the client didn’t
                }
                catch (...) { // if closing fails,
                    //make log entry that call to close failed; 
                    //note that and ... terminate or swallow
                }
            }
        }
    private:
        DBConnection db;
        bool closed;
    };
  • 相关阅读:
    【BP算法】
    【C++问题整理】
    【最大回文长度】
    【连通区域个数】
    Redis的复制(Master/Slave)、主从复制、读写分离 (下)
    Redis的复制(Master/Slave)、主从复制、读写分离
    Redis发布订阅
    Redis事务
    Redis持久化
    Redis配置文件
  • 原文地址:https://www.cnblogs.com/zoneofmine/p/15200159.html
Copyright © 2011-2022 走看看