ほとんどのユーザー定義の例外はビジネスロジックレベルの例外用であると思いますが、ユーザー定義の例外を使用するいくつかの正当な理由といくつかの良い例は何ですか?
一貫性のあるエラーメッセージを定義できるというユーザー定義の例外の唯一の利点はありますか?
例外を本当に便利にするために、例外内にどのようなロジックを記述できますか?
結局のところ、これを行うことはできません:throw new Exception("Some Error Message");
ほとんどのユーザー定義の例外はビジネスロジックレベルの例外用であると思いますが、ユーザー定義の例外を使用するいくつかの正当な理由といくつかの良い例は何ですか?
一貫性のあるエラーメッセージを定義できるというユーザー定義の例外の唯一の利点はありますか?
例外を本当に便利にするために、例外内にどのようなロジックを記述できますか?
結局のところ、これを行うことはできません:throw new Exception("Some Error Message");
ユーザー定義の例外があると、さまざまな種類のエラーを特定の方法で処理できるため便利です。すべての例外を別のテキスト メッセージで System.Exception としてスローできるのに、なぜ .NET は非常に多くの異なる種類の例外を定義するのでしょうか? .NET にさまざまな種類の例外がある理由は、個々の種類のエラーをキャッチして、異なる方法で処理できるからです。これは、発生した例外のタイプに基づいて異なる応答を提供できるように、独自のユーザー例外を定義するのと同じ理由です。
追加データを含むユーザー定義の例外を作成することもできます。たとえば、列挙型、整数のエラー コード、または呼び出し側プログラムが何が問題なのかを特定するのに役立つ可能性があるその他のものに基づいて、重大度レベルを定義できます。例外に含めるロジックについては、通常、何が問題なのかを報告し、ロジック (エラーに対して何をすべきか) を呼び出し元のプログラムに任せるようにしています。場合によっては、エラーが特定の重大度レベルを超えた場合に、エラーをログ ファイルに自動的に書き込むように例外コードを設定します (たとえば、警告はスローされますが、重大なエラーのみがログ ファイルに書き込まれます)。
ユーザー定義の例外はほとんど作成しないでください。それらは、誰かが例外をキャッチして、それに対して特定のことを行う場合にのみ使用する必要があります。の代わりに例外をInvalidOperationException
スローしてもコードの動作が異なる場合は、をスローしInvalidOperationException
ます。
.NET フレームワークにはすでに非常に多くの例外があり、例外的な状況で使用できる例外が見つかった場合は、それらを使用する必要があります。
たとえば、構成クラス (通常は のラッパー) では、値を正しく解析できない場合ConfigurationManager
にスローします。ConfigurationErrorsException
テキストまたは特定の形式を必要とするその他のものからカスタム値を解析し、解析に失敗すると、FormatException
ただし、BankAccount
オブジェクトに 10 ポンドを引き出すのに十分なお金がない場合は、書いてスローInsufficentFundsException
します。そうすれば、その特定のエラー ケースが発生した場合に対処できるからです。
これが(多少)役立つことを願っています。
いいえ、メッセージだけではありません。catch ブロックの例外リストでユーザー定義のものを探すことができます。
catch(UserDefinedException){}
catch(Exception){}
発生した特定の何かを探したいときはいつでも、ユーザー定義の例外を使用できます。クライアント ID が指定された範囲外であり、それを具体的に探したい場合があります。エラー メッセージを解析する必要はありません (メッセージが後で変更された場合など、面倒でエラーが発生しやすくなります)。あなたは「ねえ、これが起こった。あなたはそれに注意する必要があります。」
ユーザー定義の例外をコンポーネント内で使用して、コンポーネントのコンシューマーが catch (Exception) ブロックよりも高いレベルの粒度でそれらをキャッチできるようにすることができます。これにより、コンポーネントのコンシューマーは、スローされた例外に基づいてさまざまなタスクを実行できます。ユーザー定義の例外は、消費者が例外を使用してこのように区別することが実際に期待される場合にのみ作成する必要があります。
プロパティを追加して、エラー コードなどのユーザー定義の例外を含む追加のメタデータを格納することもできます (たとえば、アンマネージ API を呼び出す場合)。これは、単純に Exception オブジェクトの Data プロパティに何かを入れるよりもユーザー フレンドリーです。