C# 言語の例外処理機能は、プログラムの実行時に発生する予期しない状況や例外的な状況に対処するのに役立ちます。 例外処理では、 try
、 catch
、および finally
キーワードを使用して、成功しない可能性のあるアクションを試し、実行するのが妥当であると判断した場合にエラーを処理し、その後リソースをクリーンアップします。 例外は、共通言語ランタイム (CLR)、.NET またはサード パーティ製ライブラリ、またはアプリケーション コードによって生成できます。 例外は、 throw
キーワードを使用して作成されます。
多くの場合、例外は、コードが直接呼び出したメソッドではなく、コールスタックのさらに下位のメソッドによってスローされることがあります。 例外がスローされると、CLR はスタックをアンワインドし、特定の例外の種類に対して catch
ブロックを持つメソッドを探し、見つけた最初の catch
ブロックを実行します。 呼び出し履歴内の任意の場所に適切な catch
ブロックが見つからない場合は、プロセスが終了し、ユーザーにメッセージが表示されます。
この例では、メソッドは 0 で除算をテストし、エラーをキャッチします。 例外処理がないと、このプログラムは DivideByZeroException がハンドルされない エラーで終了します。
public class ExceptionTest
{
static double SafeDivision(double x, double y)
{
if (y == 0)
throw new DivideByZeroException();
return x / y;
}
public static void Main()
{
// Input for test purposes. Change the values to see
// exception handling behavior.
double a = 98, b = 0;
double result;
try
{
result = SafeDivision(a, b);
Console.WriteLine($"{a} divided by {b} = {result}");
}
catch (DivideByZeroException)
{
Console.WriteLine("Attempted divide by zero.");
}
}
}
例外の概要
例外には、次のプロパティがあります。
- 例外は、すべてが最終的に
System.Exception
から派生する型です。 - 例外をスローする可能性のあるステートメントの周囲で
try
ブロックを使用します。 -
try
ブロックで例外が発生すると、制御フローは、呼び出し履歴内の任意の場所に存在する最初の関連付けられた例外ハンドラーにジャンプします。 C# では、catch
キーワードを使用して例外ハンドラーを定義します。 - 特定の例外の例外ハンドラーが存在しない場合、プログラムはエラー メッセージで実行を停止します。
- 例外を処理して、アプリケーションを既知の状態のままにしない限り、例外をキャッチしないでください。
System.Exception
をキャッチした場合は、throw
ブロックの末尾にあるcatch
キーワードを使用して再スローします。 -
catch
ブロックで例外変数が定義されている場合は、それを使用して、発生した例外の種類に関する詳細情報を取得できます。 - 例外は、
throw
キーワードを使用してプログラムによって明示的に生成できます。 - 例外オブジェクトには、呼び出し履歴の状態やエラーのテキストの説明など、エラーに関する詳細情報が含まれています。
-
finally
ブロック内のコードは、例外がスローされているかどうかに関係なく、実行されます。finally
ブロックを使用してリソースを解放します。たとえば、try
ブロックで開かれたストリームやファイルを閉じます。 - .NET のマネージド例外は、Win32 構造化例外処理メカニズムの上に実装されます。 詳細については、「構造化例外処理 (C/C++)」および「Win32 構造化例外処理の徹底解説」を参照してください。
C# 言語仕様
詳細については、「C# 言語仕様の例外」を参照してください。 言語仕様は、C# の構文と使用法の決定的なソースです。
こちらも参照ください
.NET