Java でカスタム例外を定義する大きな理由はありますか?
6 に答える
2 つの理由がすぐに思い浮かびます。
- 簡単に言う
try { ... } catch (Exception e) { ... }
と、独自のサブクラスを持つことで、個別の例外ケースを個別に処理できます。(レポートを実行する権限がない場合と、レポートの実行が失敗した場合の違いなど)。 - 追加のコンテキストを追加できます。たとえば、独自の がある場合
AlreadyLoggedInException
、その例外には、他のセッションが開始された IP アドレスを取得するメソッドを含めることができます。または、AccountLimitExceededException
現在のアカウントの制限を含めることができます。例外の追加情報により、例外をキャッチしたときに、より十分な情報に基づいた応答が得られる可能性があります。
簡単に言うと、各例外を正しい方法で処理できるようになります。
次のコードを検討してください
try {
doSomethingThatCouldThrowManyExceptions();
}
catch (ExceptionalCircumstance1 ex) {
// deal with this specific circumstance
}
catch (ExceptionalCircumstance2 ex) {
// deal with this specific circumstance
}
catch (ExceptionalCircumstance3 ex) {
// deal with this specific circumstance
}
finally {
// do some common code
}
これがないと、キャッチオール タイプの例外を実行しようとすることになります。
ただし、キャッチオールでうまくいく場合でも、クラス階層は、を使用してすべての例外をキャッチできることを意味しますcatch(Exception ex) {}
。
エラー固有の情報を提供し、よりきめ細かい例外ハンドラーを許可します。
はい。大きな利点は、必要な意味を持つ例外をスローできることです。既存の例外を再利用する場合、例外をキャッチするコードは、実際の例外がコードによってスローされたのではなく、他のライブラリ パーティ コードによってスローされた可能性に対処する必要があります。これにより、エラー処理が不安定になる傾向があります。
カスタム例外を使用すると、単なるエラーではなく、特定の種類のエラーが発生したことを発信者に伝えることができます。したがって、呼び出し元は、この種のエラーに固有のことを行う場合があります。
車のアナロジーを使用してみましょう: あなたの車は、独特の赤いライトが点滅して始動を拒否することを好みますか?
私の見解では、カスタム例外の主な動機は、アプリケーション ドメインのより良いモデリングを達成することです。クラスを設計するときは、オブジェクトに名前を付けて責任を割り当てるために多大な労力を費やします。この時点で、考えられるエラー条件を検討するための努力は良い投資だと思います。たとえば、より深く掘り下げると、クライアントは処理が必要ないくつかの一般的な例を提供することがよくあります (たとえば、無効なデータ、論理的制約の違反、信頼できないセンサーなど)。その結果、コードの理解と変更が容易になります。アプリケーション固有のエラーは適切に分離されており、追加のエラーの処理は簡単に実現できます。
もう 1 つのポイントは、システムのさまざまな部分の抽象化が向上する可能性があることです。たとえば、永続化部分の実装が将来変更されることが本当に予想される場合は、その API でカスタム例外を使用する方がはるかに優れています。そうしないと、後でさまざまな場所で SQLException または SAXExceptions を処理するのが楽しくなります :-)