在构造函数中使用以下代码将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
}
}
我相信我只是允许从CTOR抛出异常,因为我正在使用智能指针(IXMLDOMDocumentPtr)。
让我知道你的想法......
答案 0 :(得分:1)
C ++保证在异常的情况下,所有完全构造的对象都将被销毁。
由于m_docPtr
是class Configuration
的成员,它将在class Configuration
构造函数体开始之前完全构造,因此如果您从class Configuration
身体抛出异常第一个代码段m_docPtr
中的内容将被销毁。
答案 1 :(得分:0)
你打算在catch区块做任何事吗?如果没有,你可能不需要try catch。在Windows上,我相信catch(...)捕获硬件中断(专家请更正),请记住这一点。