0

是否可以在我的构造函数中使用以下代码将 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;
    }

}

基于更有效的 C++ 中的 Scott Myers RAII 实现,如果他分配任何资源(即指针),他会进行清理:

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 抛出异常。

让我知道你的想法....

4

2 回答 2

1

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

由于m_docPtr它的一个成员class Configuration将在构造函数主体开始之前完全构造,因此如果您按照您在第一个片段中的预期class Configuration从主体抛出异常,则将被销毁。class Configurationm_docPtr

于 2010-06-09T11:32:30.073 回答
0

你打算在 catch 块中做任何事情吗?如果没有,您可能不需要 try catch。在 Windows 上,我相信 catch(...) 会捕获硬件中断(请专家纠正),请记住这一点。

于 2010-06-09T11:00:49.303 回答