C++ 杂记

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

2017-07-20  本文已影响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 应该提供一个普通函数(而非在析构函数中)执行该操作。
上一篇下一篇

猜你喜欢

热点阅读