2012-02-15 1 views
2

私はコード設計の質問があります。 私の質問は、ユーザーエラー処理コードをどこに置くべきか、どの方法を使用すべきかです。どこでエラーをチェックするか

これは私のユーザがファイル名を関数に与えるべきで、この関数はファイルを開いて操作しようとします。ファイルが存在しない場合は、ユーザーに通知して、新しく入力したファイル名で再試行したいと思います。私が理解しているように、この場合には例外処理は適切な解決策ではありません。 今私はいくつかの選択肢があると信じています。ファンクションを呼び出す前にファイルが存在することを確認してください。 ファンクション内に存在するかどうかをチェックし、成功したかどうかを示す真の偽を返します。メッセージを出力する関数を呼び出していない場合は、元の関数に戻る前に変更する必要があります。

どちらの方法が推奨されているのですが、私が使用するはずのより良い代替/ lib機能があります。

ご質問ありがとうございます。申し訳ありませんが、私はこれらのことを正しく試してみたいと思っています。

+0

なぜ例外処理が適切ではないと思いますか? – Useless

+0

ユーザーが関数にファイル名を指定したとすると、ファイル名が関数の*引数*であることを意味するか、一度実行した関数は*ファイル名を要求し受け付ける*という意味ですか? – Beta

+0

私はstd例外処理は、ユーザー入力などの実行時エラーのためのものではないと思った。ファイル名は、プログラム内の他の場所からユーザーからフェッチされる引数です。 – wookie1

答えて

1

関数の特定の入力が必要な場合は、予期しない引数が高性能アプリケーションを作成しようとする場合を除いて予期しない動作になる場合は、関数内の引数を常にチェックする必要があります。それはの<stdexcept>のためのものです。

もちろん、プロシージャに指定する引数が正しいことを常に確認してください。しかし、あなたの機能によって現在何かが間違っていると伝えることができれば、それはあなたを害するものではありません。あなたのプログラムはstd::coutを読むことができないので、例外を守るかエラーコードを返す必要があります。

#include <iostream> 
#include <fstream> 
#include <stdexcept> 
#include <string> 

void myFunction(const std::string& inputFileName){ 
    std::ifstream myFile(inputFileName.c_str()); 
    if(!myFile.good()) 
     throw std::invalid_argument("The file does not exist!\n"); 
    /* other operations */ 
} 

int main(){ 
    std::string userInput; 

    std::cin >> userInput; 
    while(userInput != "quit"){ 
     try{ 
      myFunction(userInput); 
     }catch(const std::invalid_argument& e){ 
      std::cout << e.what(); 
     } 
     std::cin >> userInput; 
    } 
    return 0;  
} 
/* this code is just a small example and could be improved */ 
2

私は簡単に、彼らは適切ではないと言う例外を無視しません。それは全体のデザインに依存します。あなたのクライアントが例外処理を有効にしているかどうか。例外クラス階層を構築して、std::exceptionから継承した,CFileAccessDeniedException ...などを継承して、CFileExceptionとしましょう。あなたのクライアントがこのタイプの例外を処理してくれるのであれば、それを使用してください!例外オブジェクト内のエラーに関する詳細情報をエラーコードと比較して渡すことができます。さらに、クライアントは例外の処理場所を決定できます。

他の解決策は、エラーごとに異なるエラーコードを返すことです。 true/falseを返さないでください。クライアントに多くの情報を与えることはありません(機能が失敗した理由)。クライアントは、エラーコードをテストし、それに応じてメッセージ(エラーの説明、エラー原因)を生成する必要があります。代わりに例外を使用すると、失敗した関数でそのメッセージを作成することができます。これは、エラーとその性質に関する詳細情報を含むコンテキストであり、より説明的なメッセージを作成することができます。より小さなものにあなたの機能を壊すについて

:あなたは、2つの別々の機能を持つ価値があるだろうので、「機能は、ファイルを開いて、それを操作しようとする」と述べた - ファイルとそれを処理している別のを開くものを。例外/エラーの場合と同じ規則が適用されます - ファイルのオープンに失敗した場合は例外がスローされ、2番目の例外は入力されません。

3

通常、ファイル名を取得してからファイルを開こうとしてください。失敗した場合はループしてください。関数はstd::istream&で、ファイル名ではありません。少なくともあなたが示す小さなシナリオでは。あるいは、関数はファイル名を取り、ファイルを開くことができなかったかどうかを示すエラーコードを返すことができます。例外を使用する代わりにさらに多くの欠点があるケースがあります(あまり頻繁ではありませんが、存在します)。例外が最も適切な解決策になります。

関連する問題