美文网首页C++ 杂记
条款 08:别让异常逃离析构函数

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

作者: 赵者也 | 来源:发表于2017-07-20 08:07 被阅读1次

    Effective C++ 中文版 第三版》读书笔记

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

    如果抛出异常就结束程序。通常通过调用 abort 完成:

    Toby::~Toby(){
        try{t.Close();}
        catch(...){
            //< 记录日志
            std::abort();
        }
    }
    

    吞下因调用某函数而发生的异常:

    Toby::~Toby(){
        try{t.Close();}
        catch(...){
                   //< 记录日志
        }
    }
    

    最佳方式:

    class Toby{
    public:
        ...
    void close(){
       t.Close();
       bClosed = true;
    }
    
    ~Toby(){
       if(!bClosed){
          try{t.Close();}
          catch(...){
             //< 记录日志
             ...
          }
       }
    }
    
    private:
       SomeClass t;
       bool bClosed;
    };
    

    ** 请记住:**

    1. 析构函数绝对不要吐出异常。如果一个被析构函数调用的函数可能抛出异常,析构函数应该捕获任何异常,然后吞下它们(不传播)或结束程序。
    2. 如果客户需要对某个操作函数运行期间抛出的异常做出反应,那么 class 应该提供一个普通函数(而非在析构函数中)执行该操作。

    相关文章

      网友评论

        本文标题:条款 08:别让异常逃离析构函数

        本文链接:https://www.haomeiwen.com/subject/hfqdkxtx.html