例外階層
例外は、実行プログラムによって生成される例外と、共通言語ランタイムによって生成される例外の 2 種類に分類されます。 また、アプリケーションまたはランタイムによってスローされる例外の階層もあります。
Exception は、例外の基本クラスです。 ApplicationException や SystemException などのさまざまな例外クラスが Exception から直接継承されます。 ほとんどのランタイム例外は、この 2 つのクラスに基づいて作成されます。
Exception から直接派生するほとんどの例外では、Exception クラスへ機能が追加されることはありません。 たとえば、InvalidCastException クラス階層は次のようになります。
Object Exception SystemException InvalidCastException
エラーが発生すると、ランタイムは SystemException の適切な派生クラスをスローします。 このようなエラーは、ランタイム チェックのエラー (配列範囲外エラーなど) が原因で発生します。また、任意のメソッドの実行中に発生することがあります。 新しい例外を作成するアプリケーションをデザインするときには、Exception クラスから例外を派生させてください。 SystemException をキャッチすることや、アプリケーションで SystemException をスローすることはお勧めできません。
重大な例外には、ExecutionEngineException、StackOverflowException、および OutOfMemoryException があります。これらの例外は、ランタイムによりスローされるか、または回復不能な状況でスローされます。
相互運用例外は SystemException から派生し、ExternalException によって拡張されます。 たとえば、COMException は ExternalException から派生した例外で、COM 相互運用操作時にスローされます。 Win32Exception と SEHException も ExternalException から派生します。
ランタイム例外の階層
ランタイムには、SystemException から派生した基本的な例外があります。これらの例外は、それぞれの命令の実行時にスローされます。 ランタイムの標準例外および派生クラスを作成する場合の条件を階層に基づいて次の表に示します。
例外の種類 |
基本型 |
説明 |
例 |
---|---|---|---|
オブジェクト |
すべての例外の基本クラスです。 |
なし (この例外の派生クラスを使用)。 |
|
Exception |
すべての実行時生成エラーの基本クラスです。 |
なし (この例外の派生クラスを使用)。 |
|
SystemException |
配列のインデックスが誤っている場合にだけランタイムによりスローされます。 |
配列に対して、配列の有効範囲外のインデックスを付けた場合。 arr[arr.Length+1] |
|
SystemException |
null オブジェクトが参照された場合にだけランタイムによりスローされます。 |
object o = null; o.ToString(); |
|
無効なメモリがアクセスされた場合にだけ、ランタイムによりスローされます。 |
アンマネージ コードまたは安全でないマネージ コードと相互運用されていて、無効なポインターが使用された場合に発生します。 |
||
SystemException |
無効な状態の場合にメソッドによりスローされます。 |
基になるコレクションから Item を削除した後で、Enumerator.GetNext() を呼び出した場合。 |
|
SystemException |
すべての引数例外の基本クラスです。 |
なし (この例外の派生クラスを使用)。 |
|
ArgumentException |
null の引数を受け取らないメソッドによってスローされます。 |
String s = null; "Calculate".IndexOf (s); |
|
ArgumentException |
引数が特定の範囲内にあることを検査するメソッドによってスローされます。 |
String s = "string"; s.Chars[9]; |
|
SystemException |
ランタイム外部の環境で発生した例外、およびランタイム外部の環境を対象とした例外の基本クラスです。 |
なし (この例外の派生クラスを使用)。 |
|
ExternalException |
COM HRESULT 情報をカプセル化する例外です。 |
COM 相互運用機能で使用されます。 |
|
ExternalException |
Win32 構造化例外処理情報をカプセル化する例外です。 |
アンマネージ コード相互運用機能で使用される場合。 |