1

ストリームに何かが発生した場合にカスタム例外をスローできる writeBinary(ostream) メソッドを持つクラス X があります。

fstream への書き込みとエラーチェックの正しい方法は何ですか?

これが私のバージョンです: 何かが欠けているかどうか、またはエラーをキャッチする必要があるかどうかを知りたいです。

    ofstream ofs("X.binary.tmp");
    if (!ofs) {
       cerr << "Could not open file for writing";
       throw runtime_error("Could not open file for writing");
    }
    try {
      x.writeBinary(ofs);
     } catch(CustomException& e) {
      // remove the temporary file
       int x = unlink("X.binary.tmp");
       if (x) {
        cerr << "Failed to remove file";
       }
       throw;
     }

    if (!ofs) { // is this check necessary?
     int x = unlink("X.binary.tmp"):
    if (x) {
        cerr << "Failed to remove file";
       }
       throw std::runtime_error("Stream error");
    }
   rename("X.binary.tmp", "X.binary");

この寄せ集めの例外を単純化できますか?

4

1 に答える 1

0

物事をはるかに面倒にしない1つの方法は、リソース処理オブジェクトを作成することです。つまり、「tempfile」オブジェクトは、コンストラクターに指定された名前で新しいファイルを開き、ファイル名が空白でない場合は、デストラクタでunlinkを呼び出します。 。次に、ファイルの名前を変更し、名前を空白に設定する名前変更関数を設定します。そしてもちろん、オブジェクトからのオフストリームを提供する関数。

それは同じくらいのコードだと確信していますが、見た目はずっときれいになり、生活がずっと楽になります。

お気づきかもしれませんが、多くの潜在的なエラーに対処するコードを書くのは簡単ではありません...

于 2012-12-28T16:08:10.993 に答える