ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-06-19 01:03:51  阅读:139  来源: 互联网

标签:... closed Effective 记录 c++ abort 析构 close 异常


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

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

    class A
    {
        public:
        	···
        	~A(){...}	//可能抛出一个异常
    }
    
    void doSomething()
    {
        std::vector<A>v;
    }	//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;
      }
      

标签:...,closed,Effective,记录,c++,abort,析构,close,异常
来源: https://www.cnblogs.com/chenglixue/p/16389728.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有