1

ファイルから読み取る関数がC++にあります。関数は、ファイルの名前を表す文字列をパラメーターとして受け取ります。この関数には、エラー(ファイルが存在しないなど)をチェックするためのif条件があります。

    void B::readFile(string file)
        {
            ifstream stfile;
            stfile.open(file.c_str(), ios::in);

            if ( stfile.fail() ) {
                cerr << "Unable to open input file" << endl;
                exit(-1);
            }

           //---goes on here

         }

私の質問は:

  1. 上記の実装はエラーをチェックする正しい方法ですか、それとも例外をスローする必要がありますか?どちらかを選ぶ理由はありますか?
  2. 上記の実装が正しい場合、テスト用に:メソッドに文字列を返すようにし(「入力ファイルを開けません」)、この文字列がテストで返されるかどうかを確認する必要がありますか?
4

3 に答える 3

2

1)アプリに何をさせたいですか?障害はより高いレベルで回復可能ですか?そうである場合は、例外をスローします。そうではなく、これがかなり早い段階のコードである場合は、エラーで終了するだけで問題ありませんが、失敗したファイル名をログメッセージに追加する必要があります。

2)絶対にありません。成功/失敗の場合はtrue/falseなどの値を返すようにすることもできますが、そのような文字列にすることは絶対に避けてください。ファイルが存在しない可能性があり、上位レベルのコードがそれを処理するか、気にしない可能性が高い場合は、エラーコードを返します。(例外は高価なので、一般的な条件ではスローしないでください)。

于 2013-03-18T19:46:07.103 に答える
2

上記の実装はエラーをチェックする正しい方法ですか、それとも例外をスローする必要がありますか? どちらかを選ぶ理由はありますか?

エラーが検出されたときにエラーを完全に処理できる場合、その実装は正しいです。(プログラムを終了する必要があると判断しているようです)

検出された場所で問題を完全に処理できない場合は、例外をスローする必要があります。

上記の実装が正しい場合、テストのために: メソッドが文字列 (「入力ファイルを開けません」) を返すようにし、この文字列がテストで返されるかどうかをアサートする必要がありますか?

ASSERT本番コードでは効果がありません。プログラムの動作を に依存させるべきではありませんASSERT

問題を解決できる場所に焦点を当てます。呼び出し元のコードでこの問題の処理方法を決定する場合は、throw.

catch/がない C では、エラー コードを返すのが一般的throwです。しかし、この方法では、多くのスタック レベルを介してエラーを返さなければならない可能性があるため、小さくて簡潔な関数を作成するプログラマが罰せられます。

于 2013-03-18T19:46:16.993 に答える
1

それはすべて、どの「クライアント」がこの方法を使用するかによって異なります。誰がこのコードを呼び出すのか、そして彼らはそれを何のために使うのか。

例外がスローされない方がよい場合は、リターン形式を使用してください。メッセージ対数に関しては、それは人々がそれをどのように使用するかにも依存します。

私は通常、他の戻り方法よりも例外をスローすることを好みます。これは、カスタム例外を作成し、例外に詳細を追加して、呼び出し元が何が起こったかを正確に把握できるようにするためです(コードで修正する方法を理解できるようにするため)。

于 2013-03-18T19:45:04.933 に答える