Exception
はすべての例外の基本型であり、そのため非常に不特定です。この例外は、有用な情報が含まれていないだけなので、スローしないでください。例外をキャッチするコードを呼び出しても、意図的にスローされた例外(ロジックから)を、まったく望ましくない他のシステム例外から明確にし、実際の障害を指摘することはできませんでした。
同じ理由がにも当てはまりますSystemException
。派生型のリストを見ると、非常に異なるセマンティクスを持つ他の多数の例外を確認できます。
NullReferenceException
とIndexOutOfRangeException
は違う種類のものです。現在、これらは非常に特殊な例外であるため、スローしても問題ありません。ただし、これらは通常、ロジックに実際の誤りがあることを意味するため、これらをスローする必要はありません。たとえば、null参照例外は、であるオブジェクトのメンバーにアクセスしようとしていることを意味しますnull
。それがコードで可能性がある場合は、常に明示的にチェックしnull
て、より有用な例外をスローする必要があります(たとえばArgumentNullException
)。同様に、IndexOutOfRangeException
sは(リストではなく配列の)無効なインデックスにアクセスすると発生します。あなたはいつも最初にそれをしないことを常に確認しそして例えば配列の境界を最初にチェックすべきです。
例えば、これらの2、のようないくつかの他の例外がありますInvalidCastException
かDivideByZeroException
あなたのコード内の特定の障害のためにスローされ、通常、あなたが何かを間違ってやっているか、あなたが最初のいくつかの無効な値をチェックされていないことを意味しています。コードから故意にそれらをスローすることにより、呼び出し側のコードが、コード内の何らかの障害が原因でスローされたかどうか、または実装で何かに再利用することにしたかどうかを判断するのが難しくなります。
もちろん、これらの規則にはいくつかの例外があります(笑)。既存のものと完全に一致する例外を引き起こす可能性があるものを構築している場合は、特にいくつかの組み込み動作を一致させようとしている場合は、それを自由に使用してください。非常に具体的な例外タイプを選択することを確認してください。
ただし、一般的に、ニーズを満たす(特定の)例外を見つけない限り、特定の予期される例外に対して独自の例外タイプを作成することを常に検討する必要があります。特にライブラリコードを記述している場合、例外ソースを分離するのに非常に役立ちます。