Caution

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

C#辞典

  1. トップページ
  2. C#辞典
  3. throw / カスタム例外

throw / カスタム例外

例外を意図的に発生させる『throw』キーワードと、独自のエラー情報を持つカスタム例外クラスの定義方法です。

構文
// 例外をスローします。
throw new ExceptionType("メッセージ");

// カスタム例外クラスを定義します。
class クラス名 : Exception
{
	public クラス名(string message) : base(message) { }
}
構文一覧
構文 / メンバー概要
throw new Exception("msg")例外をスローします。現在のメソッド呼び出しを中断し、最も近い catch ブロックに制御を移します。
throw;catch ブロック内で使用し、捕捉した例外を再スローします(スタックトレースを保持します)。
Exceptionすべての例外の基底クラスです。
ArgumentException引数が無効な場合にスローします。
ArgumentNullException引数が null の場合にスローします。
InvalidOperationExceptionオブジェクトの状態に対して無効な操作を行った場合にスローします。
NotImplementedException未実装のメソッドを示す場合に使用します。
サンプルコード
using System;

// throw で例外をスローします。
void 年齢チェック(int 年齢)
{
	if (年齢 < 0 || 年齢 > 150) {
		throw new ArgumentOutOfRangeException(nameof(年齢), "年齢は 0〜150 の範囲で指定してください。");
	}
	Console.WriteLine($"年齢: {年齢}");
}

try {
	年齢チェック(200);
} catch (ArgumentOutOfRangeException e) {
	Console.WriteLine(e.Message);
}

// カスタム例外クラスを定義します。
class AppException : Exception
{
	public int StatusCode { get; }

	public AppException(string message, int statusCode) : base(message)
	{
		StatusCode = statusCode;
	}
}

// カスタム例外をスローして捕捉します。
try {
	throw new AppException("認証に失敗しました。", 401);
} catch (AppException e) {
	Console.WriteLine($"[{e.StatusCode}] {e.Message}");
}

// catch 内で再スローします(スタックトレースが保持されます)。
void 処理()
{
	try {
		int 結果 = int.Parse("abc");
	} catch (FormatException) {
		Console.WriteLine("ログ: 変換エラーを検出しました。");
		throw; // 例外を再スローします。
	}
}

try {
	処理();
} catch (FormatException e) {
	Console.WriteLine("上位で捕捉: " + e.Message);
}
概要

カスタム例外クラスは『Exception』(または既存の例外クラス)を継承して定義します。アプリケーション固有のエラーコードや追加情報をプロパティとして持たせることで、catch 側での詳細なエラーハンドリングが可能になります。

再スローは『throw e;』と書くとスタックトレースが新しい位置に上書きされてしまうため、スタックトレースを保持したい場合は引数なしの『throw;』を使用してください。

例外の捕捉構文は『try / catch / finally』を参照してください。

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