Бросать исключение в CTOR и Smart Pointers - PullRequest
0 голосов
/ 09 июня 2010

Нормально ли иметь следующий код в моем конструкторе для загрузки 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;
    }

}

На основе реализаций Скотта Майерса 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
  }
}

Полагаю, я в порядке, позволяя просто генерировать исключения из CTOR, поскольку я использую умный указатель (IXMLDOMDocumentPtr).

Дайте мне знать, что вы думаете ....

Ответы [ 2 ]

1 голос
/ 09 июня 2010

C ++ гарантирует, что в случае исключения все полностью построенные объекты будут уничтожены.

Поскольку m_docPtr является членом class Configuration, оно будет полностью построено до того, как начнется тело конструктора class Configuration., поэтому, если вы выбросите исключение из class Configuration тела, как вы предполагали в своем первом фрагменте, m_docPtr будет уничтожено.

0 голосов
/ 09 июня 2010

Планируете ли вы сделать что-нибудь в блоке catch? Если ничего, то вам, вероятно, не нужна попытка поймать. В Windows я считаю, что catch (...) отлавливает аппаратные прерывания (эксперты, пожалуйста, исправьте), что-то нужно иметь в виду.

...