私は、ライターが完了したことを示す明示的なメッセージをファイルに書きたいファイルフォーマットを作成しています。私は過去に、生成プログラムがクラッシュしたところでファイルを生成することで問題を抱えていました。明示的なマーカーがないと、ファイルを検出するためのプログラムを読む方法が不完全であるため、私は認識せずにファイルを切り捨てました。RAIIをファイルマーカーの終わりに書き込むには?
私はこれらのファイルを書くために使用されるクラスを持っています。通常は、「オープン」操作と「クローズ」操作がRAIIを使用する場合は、デストラクタにファイルマーカーの終わりを書き込むコードを挿入します。このようにして、ユーザーは忘れることができません。しかし、例外がスローされて書き込みが完了しない状況では、デストラクタは引き続き実行されます。その場合、メッセージを書きたくないので、読者はファイルが不完全であることを知ることができます。
これは「コミット」操作がいつでも発生する可能性があります。 RAIIがコミットするのを忘れることはできないようにしたいが、例外が発生したときにコミットしたくない。ここの誘惑はstd :: uncaught_exceptionsを使うことですが、それはコードの匂いだと思います。
これに対する通常の解決方法は何ですか?人々が覚えていることだけを要求する私は、誰かが私のAPIを使用しようとするたびに、これが戸惑いになることに懸念しています。
ハーブ・サッター(Herb Sutter)は、この件に関する良い記事を掲載しています。 http://www.gotw.ca/gotw/047.htm彼の推奨は、ユーザーにファイルを明示的に閉じる(コミット)ように強制することです。さもなければそれは有効です。 –