.NET での例外の処理とスロー
アプリケーションは、実行中に発生するエラーを一貫した方法で処理できなければなりません。 .NET では、一貫した方法でアプリケーションにエラーを通知するためのモデルが用意されています。 .NET 操作では、例外をスローすることによって障害の発生を示します。
例外
例外とは、プログラムを実行することによって発生するエラー状態または予期しない動作のことです。 例外がスローされる原因として、コードまたは呼び出したコード (たとえば共有ライブラリ) 内に障害がある、オペレーティング システム リソースを使用できない、予期しない状態 (たとえば検証できないコード) をランタイムが検出したなどがあります。 アプリケーションは、他の状態からではなく、これらの状態のうちのいくつかから回復できます。 ほとんどのアプリケーション例外から回復できますが、ほとんどのランタイム例外からは回復できません。
.NET では、例外は、System.Exception クラスから継承されるオブジェクトです。 例外は問題が発生したコード領域からスローされます。 例外は、アプリケーションが処理するかプログラムが終了するまで、スタックに渡されます。
例外:従来のエラー処理メソッド
言語のエラー処理モデルは従来、エラーを検出してそれに対応したハンドラーを見つける言語固有の方法か、オペレーティング システムが備えているエラー処理機構のいずれかを使用していました。 .NET が例外処理を実装する方法は、次の利点をもたらします。
例外のスローと処理は、.NET プログラミング言語では同じように機能します。
例外を処理するための特定の言語構文を必要とせず、各言語が独自の構文を定義できます。
例外は、プロセス間、さらにはコンピューターの境界を越えてスローできます。
プログラムの信頼性を高めるための例外処理コードをアプリケーションに追加できます。
例外には、リターン コードなどの他のエラー通知メソッドに優る利点があります。 例外がスローされ、それを処理しないと、ランタイムによってアプリケーションが終了されるため、エラーが見過ごされることはありません。 無効な値は、エラーのリターン コードの確認に失敗したコードの結果として、システムを経由した伝達を続行しません。
一般的な例外
次の表は、一般的な例外とそれらの原因の例をいくつか示しています。
例外の種類 | 説明 | 例 |
---|---|---|
Exception | すべての例外の基底クラスです。 | なし (この例外の派生クラスを使用)。 |
IndexOutOfRangeException | 配列のインデックスが誤っている場合にのみ、ランタイムによってスローされます。 | 次のように、配列に対して配列の有効範囲外のインデックスを付けた場合。arr[arr.Length+1] |
NullReferenceException | null オブジェクトが参照された場合にのみ、ランタイムによってスローされます。 | object o = null; o.ToString(); |
InvalidOperationException | 無効な状態の場合にメソッドによってスローされます。 | 基になるコレクションから項目を削除した後での、Enumerator.MoveNext() の呼び出しです。 |
ArgumentException | すべての引数の例外の基底クラスです。 | なし (この例外の派生クラスを使用)。 |
ArgumentNullException | null の引数を許可しないメソッドによってスローされます。 | String s = null; "Calculate".IndexOf(s); |
ArgumentOutOfRangeException | 引数が特定の範囲内にあることを検査するメソッドによってスローされます。 | String s = "string"; s.Substring(s.Length+1); |