【发布时间】:2013-12-20 09:29:51
【问题描述】:
我有一些看起来有点像这样的代码:
void writeToStream( std::ostream & outputStream )
{
MyXmlWriter xmlWriter{ outputStream };
xmlWriter.addNode();
xmlWriter.addNode();
xmlWriter.close(); // should this be called in `MyXmlWriter` destructor?
}
close 函数会写入一些 xml 关闭标签,以便正确解析文件。构造函数写入 xml 文件的标头。可以考虑xmlWriter.close(); 清理代码。 C++ 将清理代码放入析构函数是常见的建议。这样您就永远不会忘记正确清理。但是,在我们的例子中,清理代码可能会抛出。 (想象file 可以启用异常,写入文件可能会失败。)因此,如果在析构函数中调用close() 函数,那么它应该被包装在一个try-catch 块中,该块会吃掉所有抛出的异常:
MyXmlWriter::~MyXmlWriter()
{
try
{
close();
}
catch (...)
{
}
}
但是,在这种情况下,调用者不会收到任何错误通知。函数writeToStream() 可能无法在调用者不知道的情况下将结束 xml 标记写入文件。在这种情况下,最佳做法是什么?
【问题讨论】:
标签: c++ file-io destructor exception-safety