一品网
  • 首页

Effective c++ 条款8 别让异常逃离析构函数


  • c++并不禁止析构函数吐出异常,但不鼓励这样做

  • 问题:若两个异常同时存在,程序不是结束执行就是导致不明确行为

    class A
    {
        public:
        	···
        	~A(){...}	//可能抛出一个异常
    }
    
    void doSomething()
    {
        std::vectorv;
    }	//v在这被自动销毁并有责任销毁其内含的对象,如果v含有十个A,前两个A销毁时都抛出异常,会导致不明确行为
    
  • 解决方案一:

    • 若析构函数抛出异常,就调用abort(阻止异常传播)

      A::~A()
      {
          try{ a.close();}
          catch(...)
          {
              //制作运转记录,记录对close的调用失败
              std::abort;	
          }
      }
      
  • 解决方案二:

    • 吞下异常

      A::~A()
      {
          catch(...)
          {
              //制作运转记录,记录对close的调用失败
          }
      }
      
  • 解决方案三:

    • 让客户有机会对异常做出处理并且也包含方案一

      class A
      {
      public:
          void close()
      {
          a.close();
          closed = true;
      }
          ~A()
          {
              if( !closed )
              	try{ a.close();}
              catch(...)
              {
                  //制作运转记录,记录对close的调用失败
                  std::abort;	
              }
          }
      private:
          bool closed;
      }
      
effectivec++

相关


Effective C++ 第一章 让自己习惯 C++

Effective C++ 笔记 —— Item 40: Use multiple inheritance judiciously.

Effective C++ 读书笔记 名博客

条款37:绝不重新定义继承而来的缺省参数值。【Effective C++ (第三版)】

【More Effective C++】基础议题

【More Effective C++】基础议题

【More Effective C++】基础议题

【More Effective C++】基础议题

【More Effective C++】基础议题

【Effective C++】让自己习惯C++

标签

一品网 冀ICP备14022925号-6