2

3 層アプリを作成していますが、エラー処理に問題があります。問題を他のレイヤーに伝えるために、例外をスローする必要があるのか​​、メソッドを呼び出す必要があるのか​​ わかりません。

簡単な例を次に示します。
-FileChooserFrameユーザーがリスト内のファイルを選択できるようにする (プレゼンテーション層)。
-DataHandlerファイルのパスを処理し、プレゼンテーション層とデータ層の間のリンクを行う (アプリケーション層)。
-FileParserファイルを解析してそこからデータを取得する (データ層)。

ここで、ファイルが特別な構造に従う必要があるとしましょう。そうでない場合は、MessageBox を表示します。
ユーザーが解析する前に適切なファイルを選択したかどうかを知ることはできません。

私の質問は、ファイルが構造に従っていないことがわかった場合、どうすればよいですか?
私は 2 つのことを考えました:
1 - 現在のアクションを停止し、フレームに messageBox を表示するように要求するDataHandler(例: ) のメソッドを呼び出します。2 -ポップアップを表示 するカスタム例外をスローします。NotifyWrongFileErr()
FileChooserFrame

どちらの場合も一長一短があるので、どちらかを選ぶことはできません。何をするのが最も適切でしょうか?

PS: n°2 の場合、どこに例外クラスを記述しますか? アプリの例外専用のファイル内、またはそれをスローするクラスの隣に?

4

4 に答える 4

4

それはあなたの選択です。例外に関するベスト プラクティスは、通常、予期しない状況でのみ例外をスローすることです。人が無効なファイル名を選択できることを期待しているため、メソッドを呼び出すことは「ベストプラクティス」と見なされる場合があります。しかし、繰り返しますが、善悪はなく、満足している限り、好きなことをしてください。私だったら、このようなものに対して一連のデータ層の例外を作成してスローします。そうすれば、何らかのテスト コード (IoC) を使用してデータ層をテストしたい場合に、例外が表示されます。

于 2013-05-21T13:50:44.227 に答える
1

イベント処理システムはどうですか?

例外処理には、費用のかかる方法で好きな場所にイベントを「バブル」させる try/catch/throw 構造が必要です。ただし、DataHandler で処理される FileParser からイベントを発生させる (または、プレゼンテーション層の上部にバブルする) と、すべてのモジュールを他のモジュールから切り離すことができます。

ちょっとした例 (DataHandler 層が FileParser 層を「認識」していると仮定):

class FileParser
{
public event EventHandler ParsingFailedEvent;

public void ParseFile()
{
// 1. Parse the file
// 2. File structure isn't correct, raise event!

            ParsingFailedEvent.Invoke(sender, e);
}

}

class DataHandler
{
private FileParser fp = new FileParser();
public DataHandler()
{

            fp.ParsingFailedEvent+= new EventHandler(this.FileParsingHandler);
}

public void FileParsingHandler(object sender, EventArgs e)
        {
// do something, maybe display a MessageBox
}

}

これは、主に最初の例外のエラー/障害関連の状態が原因で、イベントからの例外がどのように異なるかを示しています。反対側にはメソッドがありますが、デリゲート システムまたは動的バインディング機能により、イベントの方が柔軟だと思います。

私の意見では、ロジックのカスタム例外は避けてください。コードにいつ例外を配置したかは誰にもわかりません。また、例外がアプリケーションの障害にいつ変換されるかは誰にもわかりません。

イベントを処理およびルーティングする WPF の方法を参照してください。MSDNに役立ちます。

于 2013-05-21T14:20:38.023 に答える
1

「予期される」場合、そのユーザーは無効な入力を行うことができ、それに対する標準的な応答があり、その場合、例外は必要ありません。データ処理の一部です。検証が失敗した場合は、必要なすべてのクリーンアップを必ず実行してください。

于 2013-05-21T13:49:18.153 に答える