2009-09-19 6 views
5

例外を処理する最善の方法を見つけようとしています。アプリケーションにいくつかのレイヤーがあり、BOOLの戻り値の型を使用し始めました。つまり失敗した場合はFalseを返し、成功した場合はTrueを返します。bool(return型)を使用して例外を処理するか、クライアントに例外を渡すか?

これはSaveMyRecord(somerecord)のようなメソッドでうまくいきます。私は値を渡しているので何も返さないので、boolの戻り値の型を使って成功するかどうかを示します。

しかし、GetMyRecord()のようなものが実際にIQueryableの型を返すと思うので、失敗したかどうかを教えてくれません。

私は、試行錯誤してクライアントが例外を受け取らないようにするために、私のエラーの多くを処理しています。

はたぶん良い方法は、そこにある私は、OUTパラメータを使用してのことを考えてしまったが、これは私がすべてのメソッドのシグネチャを変更し、aditionalのparamsを追加する必要があることを意味..

たぶん私は背中に例外を渡すべきですクライアントとそれを扱う?

ベストプラクティスをアドバイスするいくつかの標準またはドキュメントがありますか?

+0

サーバー側とクライアント側では何を使用していますか?例:WCF、ASMX、WinFoms、WebForms。 –

+0

@AlfredMeyersと@doveを組み合わせたものを組み合わせると、私があなたに与えようとしている答えが得られます。彼らが1つの複合的な答えで言ったことを追加するのではなく、両方を読むといいでしょう。最も重要なのは、読み上げることです。それぞれ+1。 – David

+0

サービスはインターネットに面していますか?セキュリティ要件は何ですか?安全でない可能性のある情報を例外によって公開することに懸念はありますか? –

答えて

10

バブルアップ CLIENTの例外を取り除きます。間違いなく完全に詳細に渡してください。ほとんどのベストプラクティスはこれにほぼ完全に同意していますが、最終的には最終的には周囲を処理します。この場合はCLIENTですが、それ以外の場合はWebサービスとなります。あなたはログにそれをしたい場合は

のみがそれにより多くの情報を追加したり、試してみて、特定の例外からを回復、をキャッチ。いずれの場合も、元のまま内側に元の例外をスローするか、元のままにしてそのままスローするか、コメントに指されているように「前にスローしない」

この質問は重複した部分に近いですあなたはSOに関するよくある質問がたくさんあります。私は昨日similar oneと答えました

+3

ログだけをキャッチする限り、例外がログされた後に例外を再現する限り、これは問題ありません。そうするならば、 'throw ex'の代わりに' throw'文を使うようにして、スタックトレースを破らないようにしてください。 @スコットは絶対に –

+1

です。さらに情報を追加している場合は、元の例外を作成した新しい例外の内側の例外として入れます。 n回後に回復できない場合は、あなたが言うように投げてください。 )あなたがすべてのことを知っていると思っている;)しかし、他の読者を助けるかもしれないと思った – dove

+2

スコットと個人的な経験から合意した:もしあなたのエラー条件がブール戻り値に基づいているよりはるかに複雑なアプリケーションを構築しようとすると、すぐにスパゲッティ数ヶ月前に書かれたサブルーチンの深さから偽が返されたときに何がうまくいかなかったかについて、あなたが知っていることはほとんど分かりません。基本的な問題は、戻り値が多くのレイヤーを介して処理できるコードまでスレッド化されなければならず、例外は設計によって処理できる場所に「バブルアップ」しなければならないということです。 –

5

あなたのシナリオに応じて、あなたは、このような例外シールドとして口座に他の考慮事項を取る必要があり、その後Design Guidelines for Exceptions

を読み始める必要があります。

たとえば、Webサービス(ASMXまたはWCF)をバックエンドとして使用している場合は、Improving Web Services Securityを参照し、例外処理に関する部分を読んでみるとよいでしょう。

1

これは素晴らしい質問です!

例外としてコード化しないでください。ほとんどの場合、彼らは決して起こらなかった。私は、2つの場所で例外について心配しています:ユーザーとリソース管理にエラーフィードバックを表示する(つまり、例外がスローされたときに開いているファイルを閉じる)。

4

メソッドがそのジョブを実行できない場合は、例外がスローされます。結果として例外を返さないでください。

2

推奨され、ベストプラクティスと考えられるアプローチは、例外を使用することです。例外とtry-parseパターンのガイドラインを持つFramework Design Guidelines (2nd Ed.)を読むことができる(そしてそうするべきである)。

(数値またはブール値のいずれか)のリターンコードを使用していくつかの問題があり、二大ビーイング:

  • 簡単に見落とさ/プログラマによって無視。
  • すべての状況で使用することはできません。あなたのコンストラクタが失敗するとどうなりますか?コンストラクタから明示的に値を返すことはできません。

例外を処理するときは、例外に関して意味のあることができるときにのみ処理する必要があります。例外を常に処理してクライアントがそれらを見ることができない問題は、あなたが持ってはならない例外を処理して後で(実際にデータを失うような)後で多くの問題を引き起こす可能性があることです。

1

MSは、「int」を返すComputeSomething()メソッドと、整数への参照を受け入れてBooleanを返すTryComputingSomething()メソッドを持つのが好きだろうという共通のパターンです。後者は成功すると、渡された変数にその計算を格納し、Trueを返します。 「期待された」理由で失敗した場合は、Falseを返します。どちらのルーチンでも予期しないエラーが発生した場合、例外がスローされる可能性があります。

場合によっては、別のパターンを使用して、トラブルが発生した場合に呼び出される代理人を受け入れるルーチンを用意すると便利です。そのデリゲートは、例外を返すか、基になるルーチンをfalseに戻すか、他のことを行う可能性があります。デリゲートが実行されるときに、例外がキャッチされる前に破棄される情報が利用可能になることに注意してください。たとえば、ルーチンがファイルから行を読み込み、文字20〜37を日付に変換すると仮定すると、解析エラーがある場合は入力行全体をログに記録すると便利です。渡されたデリゲートを使用すると、それを行うことができます。そのようなことがなければ、はるかに難しくなるでしょう。