次のようなコードがあります。
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 の終了タグをファイルに書き込めない可能性があります。この状況でのベストプラクティスは何ですか?