メソッドの実装の詳細を非表示にしたり、問題の抽象化レベルを向上させて、メソッドの呼び出し元にとってより意味のあるものにしたい場合があります。これを行うには、元の例外をインターセプトし、問題の説明により適したカスタム例外に置き換えることができます。
たとえば、要求されたユーザーの詳細をテキスト ファイルから読み込むメソッドを考えてみましょう。この方法では、ユーザーの ID と接尾辞「.data」が付いた名前のテキスト ファイルが存在することを前提としています。そのファイルが実際に存在しない場合、FileNotFoundException をスローしてもあまり意味がありません。各ユーザーの詳細がテキスト ファイルに格納されているという事実は、メソッド内部の実装の詳細であるためです。したがって、このメソッドは代わりに、元の例外を説明メッセージ付きのカスタム例外にラップすることができます。
表示されているコードとは異なり、ベスト プラクティスは、元の例外を新しい例外の InnerException プロパティとして読み込むことによって保持することです。これは、開発者が必要に応じて根本的な問題を分析できることを意味します。
カスタム例外を作成する場合、次のチェックリストが役立ちます。
• 例外がスローされた理由を伝える適切な名前を見つけ、その名前が「Exception」という語で終わっていることを確認します。
• 3 つの標準例外コンストラクターを必ず実装してください。
• Serializable 属性で例外をマークしていることを確認します。
• 逆シリアル化コンストラクターを実装していることを確認します。
• 開発者が例外をよりよく理解し、処理するのに役立つカスタム例外プロパティを追加します。
• カスタム プロパティを追加する場合は、必ず GetObjectData を実装してオーバーライドし、カスタム プロパティをシリアル化してください。
• カスタム プロパティを追加する場合は、Message プロパティをオーバーライドして、標準の例外メッセージにプロパティを追加できるようにします。
• カスタム例外の InnerException プロパティを使用して元の例外を添付することを忘れないでください。