Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. try / catch / finally

try / catch / finally

プログラム実行中に発生した例外を捕捉して安全に処理する『try / catch / finally』構文です。

構文
// 例外を捕捉する基本構文です。
try {
	// 例外が発生する可能性のある処理
} catch (ExceptionType e) {
	// 例外を捕捉した場合の処理
} finally {
	// 例外の有無にかかわらず必ず実行される処理
}
構文一覧
構文概要
try例外が発生する可能性のあるコードを囲むブロックです。
catch (ExceptionType e)指定した型の例外を捕捉します。複数の『catch』を並べて異なる例外を個別に処理できます。
catch (Exception e) when (条件)条件式が真の場合にのみ例外を捕捉するフィルタリング構文です。
finally例外の発生有無にかかわらず必ず実行されるブロックです。リソースの解放処理に使用します。
e.Message例外のメッセージ文字列を取得します。
e.StackTrace例外発生時のコールスタック情報を取得します。
サンプルコード
using System;

// 基本的な例外処理です。
try {
	int[] 配列 = new int[3];
	配列[10] = 100; // インデックスが範囲外です。
} catch (IndexOutOfRangeException e) {
	Console.WriteLine("配列の範囲外: " + e.Message);
}

// 複数の catch で例外の種類を使い分けます。
try {
	string 入力 = "abc";
	int 数値 = int.Parse(入力); // 変換失敗で例外が発生します。
} catch (FormatException e) {
	Console.WriteLine("形式エラー: " + e.Message);
} catch (OverflowException e) {
	Console.WriteLine("オーバーフロー: " + e.Message);
} catch (Exception e) {
	// その他すべての例外を捕捉します(最後に書きます)。
	Console.WriteLine("予期しないエラー: " + e.Message);
}

// finally で必ず後処理を実行します。
System.IO.StreamReader reader = null;
try {
	reader = new System.IO.StreamReader("data.txt");
	Console.WriteLine(reader.ReadToEnd());
} catch (System.IO.FileNotFoundException e) {
	Console.WriteLine("ファイルが見つかりません: " + e.Message);
} finally {
	// 例外の有無にかかわらずファイルを閉じます。
	reader?.Close();
	Console.WriteLine("finally ブロック実行");
}

// when フィルタで条件付き捕捉をします。
try {
	throw new Exception("重大エラー");
} catch (Exception e) when (e.Message.Contains("重大")) {
	Console.WriteLine("重大エラーを検出: " + e.Message);
}
概要

『try / catch / finally』はC#の例外処理の基本構文です。ファイル操作・ネットワーク通信・型変換など、実行時に失敗する可能性がある処理は必ず例外処理で囲んでください。未捕捉の例外はプログラムのクラッシュにつながります。

『catch』は上から順に評価されるため、具体的な例外型(FormatException など)を先に書き、汎用的な『Exception』は最後に記述します。逆にすると具体的な catch に到達しなくなります。

例外をスローする方法は『throw / カスタム例外』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。