例外階層設計


9

私の会社では、自分で設計し、インターフェイスとして指定するサーバーセントラルサービスを含むWebアプリケーションを構築しています。つまり、インターフェイスはアプリケーション固有であり、その後、時間の経過とともに変更される可能性があるサードパーティのライブラリを使用して実装されます。例外に関しては、サービスによってスローされる例外は、実装固有の例外ではなく、独自のアプリケーション固有の例外でなければならないことに気付きました。

さて、私は私たちの例外がどのように構造化され、相互に関連付けられるべきか疑問に思っています。

まず、一般的な例外について考えますMyAppException。この例外は、予期しない問題が発生したことを示しています。ユーザーにメッセージを表示して、問題が発生し、現在作業中であることを伝えることが最善の方法です。エラーは、データベースがクラッシュしたか、何か類似したものである可能性があります。この例外は、データベースを操作するすべてのメソッドからほとんどスローされます。

次に、例外を検討しますMyAppDuplicateException。この例外は、ユーザーがすでに存在するデータベースに何かを保存しようとしたことを示します。ここでは、より具体的なエラーメッセージを表示できます。この例外は、データベース行を挿入または更新するメソッドからのみスローされます。

アプリケーションにはMyAppDuplicateException、その他の予期しないエラー状況と同様のその他の例外を含めることもできます。例MyAppNotFoundExceptionなど...

今私の質問に:

  1. 他の例外は拡張する必要がありますMyAppExceptionか?実はその理由はわかりません。色んなところで見ただけで、目的があるのか​​なと思います。私が見るようにこれの欠点は、try / catch-statementがこの場合の特定の例外を気にする必要がないことです。それは単にトップの例外をキャッチすることができ、そのため、特定の例外を持っていることのほとんどのポイントであった特定のエラーを処理する必要はありません。
  2. 他の例外がない場合ではない拡張するMyAppException、すべきMyAppExceptionことjava.lang.RuntimeException?これは、コードを実行してそれをキャッチする必要はありません。例外のポイントは、何か不明なことが発生し、実行中のコードがそれを処理できるように期待されていないということだからです。リクエストのエントリポイントのコードには、キャッチMyAppExceptionしてユーザーにメッセージが表示されることを確認するtry / catchステートメントを含めることができます。

編集などの特定の例外をMyAppDuplicateExceptionチェックする必要があるかどうかは問題ではありません。チェックする必要があります。

回答:


9
  1. 特定の種類の例外(などMyAppDuplicateException)をキャッチしたい場合もあれば、例外のカテゴリ全体(たとえばMyAppException)をキャッチしたい場合もあります。持つことによりMyAppDuplicateException拡張MyAppExceptionあなたが呼び出すコードに、それは異なる例外を扱う方法にもう少し柔軟性を与えています。
  2. これに関して私が聞いた最良のアドバイスは、一般的に言えば、メソッドを呼び出すもののいずれかがその契約に従った場合、チェック例外をスローする必要があるということです。これは、「失敗することが予想される可能性のあるものは次のとおりです」という言い方です。私は間違いなくMyAppDuplicateException、チェック済みの例外(つまり RuntimeException sではない)を作成します。

一般的な落とし穴のほとんどを回避するのに役立つ非常に優れた記事がここにあります。


nr 1であなたのポイントがわかります。しかし、私たちのサービスからすべてのタイプの例外をキャッチしたいという状況に遭遇したことがないのは、私の経験です。何かがうまくいかない場合、私たちは本当にそれが何であるかを非常に知りたいです。2つ目のポイントは、MyAppExceptionはRuntimmeExceptionであるべきだということです。(他の人はチェックする必要があります、それについての質問はありません)
Ludwig Magnusson '29

@vaughandroid、リンクが壊れています。:ここではアーカイブです community.oracle.com/docs/DOC-983543
user167569

@ user167569頭を上げてくれてありがとう。リンクを修正しました。
vaughandroid 2018年

@LudwigMagnusson#1は、特定の時点で、おそらくより具体的な例外を処理した後に、例外の分岐をキャッチしたい場合の問題を示しています。これは、すべての例外をキャッチすることと同じではありません。#2の問題はコンテキストです。ファイルがそこにあるはずのリソースである場合、「ファイルが見つかりません」の実行時例外であると言えます。ただし、ユーザーが存在する場合と存在しない場合がある特定のファイル名を要求する場合は、チェックされた例外です。これは、コンテキストが事前にわからないライブラリを作成する場合に特に当てはまります。IOException
Maarten Bodewes

1

私たちのサービスによってスローされる例外は、実装 固有の例外ではなく、独自のアプリケーション固有の例外でなければならないことに気付きました。

これは、サードパーティの実装によって定義された例外を意味しますか?正しい?

まず、一般的な例外MyAppExceptionについて検討します。この例外は、予期せぬ問題が発生したことを示しており、最善策は、ユーザーにメッセージが表示され、問題が発生し、現在作業中であることを示すことです。エラーは、データベースがクラッシュしたか、類似したものである可能性があります。この例外は、データベースで動作するすべてのメソッドからほとんどスローされます。

この種の例外が、不適切なユーザー入力ではなくプログラムのエラーではなくプログラムのエラーを表す場合、Javaではランタイム例外である必要があります。

次に、例外MyAppDuplicateExceptionを検討します。この例外は、ユーザーがすでにそこにあるデータベースに何かを保存しようとしたことを示します。ここでは、より具体的なエラーメッセージを表示できます。この例外は、データベース行を挿入または更新するメソッドからのみスローされます。

これはJavaのチェック済み例外です。

他の例外がMyAppExceptionを拡張しない場合、MyAppExceptionはjava.lang.RuntimeExceptionにする必要がありますか?

はい。

これは、コードを実行するためにコードを実行する必要はありません。例外として、不明なことが発生し、実行中のコードがそれを処理できるように期待されていないためです。リクエストのエントリポイントのコードには、MyAppExceptionをキャッチし、メッセージがユーザーに表示されることを確認するtry / catchステートメントを含めることができます。

はい、そうです。


あなたは私を正しく理解しています。
Ludwig Magnusson

「コードの問題」が原因でエラーが発生したと言う場合、問題はデータベース接続などにある可能性があることを指摘したいだけです。プログラミングのエラーだけではありません。
Ludwig Magnusson、2012年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.