21 例外
21.1 全般
C# の例外は、システム レベルとアプリケーション レベルのエラー状態の両方を処理する、構造化された統一されたタイプ セーフな方法を提供します。
21.2 例外の原因
例外は、2 つの異なる方法でスローできます。
throw
ステートメント (§13.10.6) は、すぐに無条件に例外をスローします。 コントロールは、throw
の直後にステートメントに到達することはありません。- C# ステートメントと式の処理中に発生する特定の例外条件により、操作を正常に完了できない特定の状況で例外がスローされます。 この方法でスローできるさまざまな例外の一覧については、 §21.5 を参照してください。
例: 整数除算演算 (§12.10.3) は、分母が 0 の場合に
System.DivideByZeroException
をスローします。 end の例
21.3 System.Exception クラス
System.Exception
クラスは、すべての例外の基本型です。 このクラスには、すべての例外で共有される注目すべきプロパティがいくつかあります。
Message
は、例外の理由の人間が判読できる説明を含むstring
型の読み取り専用プロパティです。InnerException
は、Exception
型の読み取り専用プロパティです。 その値がnull
でない場合は、現在の例外の原因となった例外を参照します。 (つまり、現在の例外は、InnerException
を処理する catch ブロックで発生しました)。それ以外の場合、その値はnull
され、この例外が別の例外によって引き起こされなかったことを示します。 この方法で連結される例外オブジェクトの数は任意です。
これらのプロパティの値は、 System.Exception
のインスタンス コンストラクターの呼び出しで指定できます。
21.4 例外の処理方法
例外は、 try
ステートメント (§13.11) によって処理されます。
例外がスローされると (§21.2)、例外の実行時の型によって決定される、例外を処理できる最も近い catch 句が検索されます。 まず、現在のメソッドで構文的に囲まれた try
ステートメントが検索され、try
ステートメントの関連するcatch
句が順番に考慮されます。 失敗した場合、現在のメソッドを呼び出したメソッドは、現在のメソッドの呼び出しポイントを囲む構文的に囲まれた try
ステートメントを検索します。 この検索は、スローされる例外のランタイム型の同じクラスまたは基底クラスの例外クラスに名前を付けることで、現在の例外を処理できる catch
句が見つかるまで続行されます。 例外クラスに名前を付けない catch
句は、任意の例外を処理できます。
一致する catch
句が見つかると、システムは制御を catch
句の最初のステートメントに転送する準備をします。 catch
句の実行が開始される前に、システムは最初に、例外をキャッチしたステートメントよりも入れ子になったステートメントtry
関連付けられたすべてのfinally
句を順番に実行します。
一致する catch
句が見つからない場合:
- 一致する
catch
句の検索が静的コンストラクター (§15.12) または静的フィールド初期化子に達すると、静的コンストラクターの呼び出しをトリガーした時点でSystem.TypeInitializationException
がスローされます。System.TypeInitializationException
の内部例外には、最初にスローされた例外が含まれています。 - それ以外の場合、ファイナライザーの実行中に例外が発生し、その例外がキャッチされない場合、動作は指定されません。
- それ以外の場合、一致する
catch
句の検索が最初にスレッドを開始したコードに到達した場合、スレッドの実行は終了します。 このような終了の影響は、実装によって定義されます。
21.5 一般的な例外クラス
次の例外は、特定の C# 操作によってスローされます。
例外の種類 | 説明 |
---|---|
System.ArithmeticException |
算術演算中に発生する例外 (System.DivideByZeroException 、System.OverflowException など) の基底クラスです。 |
System.ArrayTypeMismatchException |
格納されている要素の型が配列の型と互換性がないために、配列へのストアが失敗した場合にスローされます。 |
System.DivideByZeroException |
整数値を 0 で除算しようとするとスローされます。 |
System.IndexOutOfRangeException |
0 未満のインデックスまたは配列の境界外にあるインデックスを使用して配列のインデックスを作成しようとするとスローされます。 |
System.InvalidCastException |
基本型またはインターフェイスから派生型への明示的な変換が実行時に失敗した場合にスローされます。 |
System.NullReferenceException |
null 参照が使用され、参照先オブジェクトが必要になる場合にスローされます。 |
System.OutOfMemoryException |
メモリを ( new 経由で) 割り当てようとしたときにスローされます。 |
System.OverflowException |
checked コンテキストで算術演算がオーバーフローしたときにスローされます。 |
System.StackOverflowException |
保留中の呼び出しが多すぎるため、実行スタックが使い果たされたときにスローされます。通常は、非常に深い再帰または無制限の再帰を示します。 |
System.TypeInitializationException |
静的コンストラクターまたは静的フィールド初期化子が例外をスローし、それをキャッチする catch 句が存在しない場合にスローされます。 |
ECMA C# draft specification