.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);

関連項目