2009-04-06 34 views
5

エラー処理をエレガントに実装するにはどうすればよいですか?たとえば、私のデータアクセスレイヤーは2種類のエラーを投げる可能性があります: 1)アクセスが許可されていない場合は、ページにすべてが隠され、エラーメッセージ が表示されます。2) (例えば、名前はユニークではないと言います)、この場合はすべてを隠したくありません。私は、このような等等NotAuthorizedException、DuplicateException、など派生の特殊な例外タイプを作成する必要があることを考案し、ここでいくつかのコメントの結果として3層アーキテクチャのエラー処理

....それはしかし、私が見ることができる、すべての罰金とダンディです:

EDITED潜在的に2つの問題:

1)格納されているすべてのprocには、エラーメッセージを含む戻りフィールドp_errorがあります。 DBからデータを取得する際に、このフィールドをチェックして、どのタイプのエラーが返されたかを確認する必要があります。そのため、適切な例外をスローすることができます。だから、私はまだ私のエラーの種類/エラーメッセージをどこかに保存する必要があります.....言い換えれば、p_errorフィールドを最初にチェックするw/oユーザーに正確なメッセージを送る必要があります。私はエラーオブジェクトに私を連れて来る。誰でも?

2)これは、例外の数がエラーメッセージの種類の数に等しい悪夢に変わる可能性があります。

ここに何か不足していますか?

多くの皆様に感謝します!

答えて

0

独自の例外レイヤーを作成します。あなたのプレゼンテーション層に

DALExceptionManager DuplicateException DatabaseExceptionの

BLLExceptionManager NotAuthorizedException InvalidDateException

、この参照を追加し、一般的な例外ハンドラを作成します。 このようにして、例外メッセージを処理する方法を知っています。

+0

シンプルでエレガントな、私は実際にこのようなものを実装しました。 これの唯一の欠点は、 – sarsnake

4

Enterprise Libraryの例外処理ブロックをチェックアウトする必要があります。例外をラップしてレイヤー間で渡すことについては、多くのヒントとコマーシャルがあります。

+0

これはUIにどのように通知するのかはっきりしていません。 – sarsnake

+0

UIで例外をキャッチする可能性があります。自分の例外タイプを定義する必要はありません。 –

3

あなたのビジネス層はどこですか?なぜ、認証と完全性をチェックしていないのですか?これらのルールをチェックするにはDALが低すぎます。問題が発生した場合、例外をスローするのはかなりの時間です。ビジネスレイヤーやコントローラーはその例外を捕捉し、妥当なメッセージを表示することができますが、それはあなたが定期的に行うべきことではありません。私が使用して 考えていた

+0

認証はデータベースを介して行われますが、これは自分のコントロールではないため、DALからUIにエレガントに渡す方法が必要です。 第2に、一部のユーザー入力をデータベースに対して検証する必要があります。この場合、DALはビジネスレイヤーにエラーを返しますが、これを再度UIにエレガントに提示する必要があります。 – sarsnake

+0

私は1つのアプローチを念頭に置いていますが、私は他の人が何をしたのかを見たいと思います。 – sarsnake

+0

私はビジネスレイヤーのアイデアに同意します...それは私の投稿でコミュニケートしようとしていたものです...しかしどんな方法でも – bytebender

0

1つのオプションは、エラー・クラスを作成しているが、 は、私は参照することにより、ビジネス層にUI からそれを渡した後、データへ アクセス層が必要となる

私はこれをよく理解していません。すべてのレイヤーでエラーオブジェクトを渡す必要はありません。たとえば、あなたの例の1つであるerrors that inform the user that something like this already exists in the database (say name not unique - for example)では、フレームワークによってsql例外がスローされ、ビジネスレイヤーまたはUIレイヤーで特定の例外を捕捉する必要があります。

他の人が提案するエンタープライズライブラリによる例外処理ブロックでは、web.configファイルでポリシーベースの例外処理を定義できます。いくつかのエンタープライズアプリケーションを開発したい場合は、良い場所になる可能性があります。しかし、単純なアプリケーションでは、それほど遠くに行く必要はありません。

+0

はい、私はそれほど多くを得ます:)しかし、私は致命的なエラーを区別する方法が必要です。アクセス権なし)とデータ検証エラーが表示されます。これを行うより良い方法はありますか? – sarsnake

+0

エラーを表す方法には、エラーコードまたは例外の2通りがあります。すべてのレイヤーにアクセスできるかどうかはわかりませんが、例外クラスにエラーコードをラップしてスローできます。その後、すべての例外を1つの場所でキャッチします。 HTH。 –

0

上位レイヤで発生することは、データアクセスレイヤーに依存しません。上層が何をするのかを意識すべきではありません。キーエラーが重複している場合は、 "DuplicateKeyException"のようなものが投げられるはずです。認可エラー(「例外」を意味すると思われます)を打つ必要がある場合は、何もしないでください。UIレイヤーにバブルアップして、適切なエラーページを表示できます。

エラーステータスの値などが、私たちが例外を考案した理由であることに注意してください。

0

エンタープライズライブラリ例外処理ブロックは、多くの人が指摘しているように、爆弾です。ポリシーを使用すると、例外をログに記録したり、別の例外でラップしたり、元の例外ではなく新しい例外をスローするなどの操作を行うことができます。また、認証エラーや重複レコードのエラーなどに基づいて特定のアクションを実行する場合は、特定の派生例外クラスを作成して、例外タイプをキャッチして、オブジェクトを上から下に渡す必要がなくなります。例外は常に泡立つべきではありません。

関連する問題