代码之家  ›  专栏  ›  技术社区  ›  Robben_Ford_Fan_boy

在ctor和智能指针中引发异常

  •  0
  • Robben_Ford_Fan_boy  · 技术社区  · 14 年前

    在我的构造函数中使用以下代码可以将XML文档加载到成员变量中吗?如果有任何问题,将其抛出给调用方:

       MSXML2::IXMLDOMDocumentPtr m_docPtr; //member
    
    
    Configuration()
    {
        try
        {                      
            HRESULT hr = m_docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40));     
    
             if ( SUCCEEDED(hr))
             {
                m_docPtr->loadXML(CreateXML());
             }
             else
             {
                throw MyException("Could not create instance of Dom");
              }
        }
        catch(...)
        {
             LogError("Exception when loading xml");
             throw;
        }
    
    }
    

    基于Scott Myers RAII实现,在更有效的C++中,如果他省略了任何资源,即指针:

    BookEntry::BookEntry(const string& name,
                     const string& address,
                     const string& imageFileName,
                     const string& audioClipFileName)
    : theName(name), theAddress(address),
      theImage(0), theAudioClip(0)
    {
      try {                            // this try block is new
        if (imageFileName != "") {
          theImage = new Image(imageFileName);
        }
    
      if (audioClipFileName != "") {
          theAudioClip = new AudioClip(audioClipFileName);
        }
      }
      catch (...) {                      // catch any exception
    
    
        delete theImage;                 // perform necessary
        delete theAudioClip;             // cleanup actions
    
    
        throw;                           // propagate the exception
      }
    }
    

    我相信我在使用智能指针(ixmldomdocumentptr)时允许从ctor抛出异常是正确的。

    告诉我你的想法……

    2 回复  |  直到 14 年前
        1
  •  1
  •   sharptooth    14 年前

    C++保证,在异常情况下,所有完全构建的对象都将被销毁。

    自从 m_docPtr 是一个成员 class Configuration 它将在 类配置 构造函数主体开始,因此如果您从 类配置 在你的第一个片段中你想要的身体 MyDOCPTR 将被摧毁。

        2
  •  0
  •   Raam    14 年前

    你计划在接球区做什么吗?如果没有,您可能不需要尝试捕获。在Windows上,我相信catch(…)捕获硬件中断(专家请更正),这是需要记住的。