C++ 在CTOR和智能指针中引发异常

C++ 在CTOR和智能指针中引发异常,c++,constructor,smart-pointers,raii,C++,Constructor,Smart Pointers,Raii,在我的构造函数中使用以下代码将XML文档加载到成员变量中可以吗?如果存在任何问题,则将其提交给调用者: MSXML2::IXMLDOMDocumentPtr m_docPtr; //member Configuration() { try { HRESULT hr = m_docPtr.CreateInstance(__uuidof(MSXML2::DOMDocument40));

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

}
< P>基于Scott Myers RAII实现,在更有效的C++中,如果他分配任何资源,即指针:< /P>,则进行清理。
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抛出异常是可以的


让我知道你的想法

您计划在catch block中执行任何操作吗?如果没有,您可能不需要尝试捕捉。在windows上,我相信catch(…)捕获硬件中断(请专家更正),这是需要记住的。

C++保证在出现异常时,所有完全构造的对象都将被销毁


由于
m_docPtr
类配置的成员
它将在
类配置
构造函数主体开始之前完全构建,因此,如果您从
类配置
正文中抛出您在第一个代码片段
m_docPtr
中预期的异常,则将被销毁。

为什么
尝试{…}。。。捕获(…){}
?你可以修改代码,使它看起来像一个构造函数定义,否则就有点难以给出建设性的批评。我不理解你的问题。通常可以从构造函数中抛出异常。你担心什么?你会考虑什么样的选择?当抛出异常时,你担心<代码> MyDOCPTR < /C>变量是否被破坏?你有什么担心?你怀疑会有什么负面后果?@David Relihan:COM没有什么可补充的。智能指针是另一个类,被视为另一个类。我调用creatingInstance的事实是否会影响这一点?否,
m_docPtr
的析构函数将被无条件调用。