views:

68

answers:

2

Is it OK to have the following code in my constructor to load an XML document into a member variable - throwing to caller if there are any problems:

   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;
    }

}

Based on Scott Myers RAII implementations in More Effective C++ he cleanups if he alocates any resources i.e. pointers:

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
  }
}

I believe I am alright in just allowing exceptions to be thrown from CTOR as I am using a smart pointer(IXMLDOMDocumentPtr).

Let me know what you think....

A: 

Do you plan to do anything in the catch block? If nothing, you probably do not need the try catch. On windows, I believe that catch(...) catches hardware interrupts (experts please correct), something to keep in mind.

Raam
+1  A: 

C++ guarantees that in case of an exception all fully constructed objects will be destroyed.

Since m_docPtr is a member of class Configuration it will have been fully constructed before the class Configuration constructor body begins, so if you throw an exception from class Configuration body as you intended in your first snippet m_docPtr will be destroyed.

sharptooth
Does the fact I'm calling creatingInstance effect this?
David Relihan
No, the destructor of `m_docPtr` will be called unconditionally.
sharptooth