留意すべき例外処理のルールがいくつかあります。ただし、最初に、例外はコードによって公開されるインターフェイスの一部であることを覚えておく必要があります。それらを文書化します。もちろん、インターフェイスがパブリックな場合は特に重要ですが、プライベートインターフェイスでも非常に良い考えです。
例外は、コードが例外を適切に処理できる時点でのみ処理する必要があります。最悪の処理オプションは、それらについて何もしないことです。これは、それが正確に正しいオプションである場合にのみ実行する必要があります。(コードにこのような状況がある場合は、空のボディを心配しないように、その効果へのコメントを含めます。)
2番目の最悪のオプションは、原因としてアタッチされた元のものなしで無関係な例外をスローすることです。ここでの問題は、問題の診断を可能にする元の例外内の情報が失われることです。あなたは誰も何もできないものを作成しています(「機能しない」と文句を言う以外に、私たちは皆、これらのバグレポートを嫌う方法を知っています)。
はるかに良いのは、例外をログに記録することです。これにより、誰かが問題が何であるかを見つけて修正できますが、例外は、外部接続を介して失われたり報告された場合にのみログに記録する必要があります。それは、より頻繁にログを記録することが大きな問題であるためではなく、過剰なログ記録は、ログをより多くの情報を含むことなくより多くのスペースを消費することを意味するためです。あなたは例外をログに記録したら、報告することができPRECISをショートバージョンが一致させることができるように、そのレポート-または他の相関識別子-限り、あなたはまた、世代の時間を含めるよう良心(とユーザー/クライアントに必要に応じて詳細を確認してください)。
もちろん、最良のオプションは、例外を完全に処理し、エラー状況を完全に処理することです。あなたがこれを行うことができるなら、必ずそれをしてください!例外をログに記録する必要がなくなることを意味する場合もあります。
例外を処理する1つの方法は、問題のより高いレベルの説明を提供する別の例外をスローすることです(例えば、「failed to initialize
」ではなく「index out of bounds
」)。これは、例外の原因に関する情報を失わない限り、良いパターンです。詳細な例外を使用してcause
、上位レベルの例外を初期化するか、詳細を記録します(上記を参照)。低レベルの例外クラスが接続のもう一方の端に存在するという保証がないため、IPCコールなどのプロセス間境界を越えようとする場合、ロギングが最も適切です。内部の境界を越える場合は、原因として維持することが最も適切です。
あなたが見る別のパターンはキャッチアンドリリースです:
try {
// ...
} catch (FooException e) {
throw e;
}
これは、他の句から型制約を取得しない限り、アンチパターンです。catch
例外を単独で通過させることはできません。それはJavaのい機能にすぎません。
チェック例外と未チェック例外の違いは、メソッドの境界を越えるチェック例外を宣言する必要があるという事実以外にはありません。@throws
コードによって意図的にスローされていることがわかっている場合は、未チェックの例外を(javadocコメントとともに)文書化することをお勧めします。java.lang.Error
(JVM実装を書いている場合を除き)意図的にthrow またはそのサブクラスを投げないでください。
意見:予期しないエラーの場合は、常にコードのバグを表します。チェックされた例外はこの脅威を管理する方法であり、開発者がエラーケースの処理のトラブルを回避する方法として未チェックの例外を意図的に使用している場合は、ある程度クリーンアップする必要がある多くの技術的負債を積み上げています堅牢なコードが必要な場合。ずさんなエラー処理は専門的ではありません(また、エラー処理を確認することは、プログラマーがどれほど優れているかを判断するための良い方法です)。