C++ 在CTOR和智能指针中引发异常
在我的构造函数中使用以下代码将XML文档加载到成员变量中可以吗?如果存在任何问题,则将其提交给调用者: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));
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
的析构函数将被无条件调用。