C#のtry-catch-when構文を活用した高度な例外制御
生徒
「C#でエラーが出たときに処理を分けたいのですが、普通のtry-catch文だけでは足りない場合はどうすればいいですか?」
先生
「C#では、when句を組み合わせることで、条件付きで例外をキャッチすることができます。これを使うと、より細かくエラー処理を制御できますよ。」
生徒
「条件付きでキャッチできるって、どういうことですか?」
先生
「それでは、try-catch-when構文の基本と実用的な例を見ていきましょう。」
1. try-catch文とは?
C#のtry-catch文は、プログラムの実行中に発生するエラー(例外と呼びます)を処理するための仕組みです。tryブロックに実行したい処理を書き、エラーが出た場合にcatchブロックが呼ばれて安全に処理を続けることができます。
例えば、数値を文字に変換しようとして失敗した場合、エラーでプログラムが止まらないようにすることが可能です。
2. when句とは?
C#のcatchにはwhenという条件を付けられます。これは「もしエラーが発生したけれど、条件に合う場合だけ処理する」という意味です。日常の例で言えば、「雨が降ったときに傘を使う。ただし、外にいるときだけ」という条件付きの行動と似ています。
この機能を使うことで、同じ種類のエラーでも状況によって処理を分けられるのが大きなメリットです。
3. 基本的なtry-catch-whenの例
次のサンプルコードでは、数値を文字列から変換するときにエラーが発生した場合でも、条件に応じて処理を分けています。
try
{
string input = "abc";
int number = int.Parse(input); // 変換に失敗して例外が発生
}
catch (FormatException ex) when (DateTime.Now.Hour < 12)
{
Console.WriteLine("午前中にエラーが発生しました。処理を記録します。");
}
catch (FormatException ex)
{
Console.WriteLine("午後にエラーが発生しました。別の処理を行います。");
}
この例では、同じFormatException(書式のエラー)でも、「午前中」と「午後」で違う対応をすることができます。
午前中にエラーが発生しました。処理を記録します。
4. when句を使う利点
try-catch-whenを使うと、以下のようなメリットがあります。
- 細かい条件で制御:エラーの内容に応じて柔軟に対応できる
- コードの見やすさ:条件を
if文で書かずにcatchにまとめられる - 再利用性の向上:状況ごとの処理をシンプルに書ける
例えば「ファイルが見つからなかったとき、指定したフォルダかどうかで対応を変える」といったケースでも活用できます。
5. 実用的なファイル処理の例
実際の開発では、ファイルを扱うときによくエラーが発生します。例えば「指定したフォルダにファイルがない場合は別のフォルダを探す」といった処理です。
try
{
string path = @"C:\data\test.txt";
string text = File.ReadAllText(path);
}
catch (FileNotFoundException ex) when (ex.FileName.Contains("data"))
{
Console.WriteLine("データフォルダ内のファイルが見つかりませんでした。別の処理を行います。");
}
catch (FileNotFoundException ex)
{
Console.WriteLine("ファイルが見つかりません。他の場所を確認してください。");
}
データフォルダ内のファイルが見つかりませんでした。別の処理を行います。
このようにwhenを付けることで、例外の追加情報(FileNameなど)を使って条件分岐が可能になります。
6. 例外フィルタとの違い
when句は「例外フィルタ」とも呼ばれます。通常のcatchでは、すべてのエラーを受け止めてから条件分岐する必要がありますが、when句を使えば「条件に合うエラーだけ」直接処理できます。
これは、コードをよりシンプルに保ちながら、余計なエラーハンドリングを避けられるという大きな利点があります。
まとめ
C#のtry-catch-when構文は、例外処理をより柔軟に制御できる便利な仕組みです。この記事で紹介したように、単にエラーを捕まえるだけでなく、例外に含まれる情報や外部の状態を条件として利用することで、非常に細かい条件付きの例外ハンドリングが可能になります。特に、複雑なアプリケーションや大規模なプログラムでは、同じ種類の例外でも状況によって異なる対応が必要になる場面が少なくありません。そのような場合にこそ、このtry-catch-when構文が大きな力を発揮します。 例えば、ファイルが見つからない場合でも「どのフォルダを探していたのか」「どの時間帯に発生したのか」「ユーザーの操作によるエラーなのか」といった条件によって処理を変えることで、より使いやすくて安全なアプリケーションが実現できます。さらに、ログ出力を条件付きで記録するような高度な設計にも活用でき、保守性向上にもつながります。 また、try-catch-when構文はコードの読みやすさにも大きく貢献します。従来のようにcatchブロックの内部にif文を大量に書く必要がなくなり、例外処理がより整理されて理解しやすくなります。このような特徴は、プログラム全体の品質を上げるために非常に重要な要素です。
● 条件付き例外処理をさらに深く理解する
ここでは、try-catch-whenの理解をさらに深めるための追加サンプルコードを紹介します。同じ例外でも、外部状態やユーザー入力によって処理を切り替える実践的な例です。
try
{
string userRole = "guest";
string value = "xyz";
int number = int.Parse(value); // FormatExceptionが発生
}
catch (FormatException ex) when (Environment.UserName == "AdminUser")
{
Console.WriteLine("管理者の操作中に変換エラーが発生しました。詳細ログを保存します。");
}
catch (FormatException ex) when (DateTime.Now.DayOfWeek == DayOfWeek.Monday)
{
Console.WriteLine("月曜日に発生した変換エラーです。特別な処理を行います。");
}
catch (FormatException ex)
{
Console.WriteLine("一般的な変換エラーが発生しました。通常のエラー処理を行います。");
}
このコードでは、管理者ユーザーの操作かどうか、曜日が月曜日かどうかなどの条件に応じて異なる処理を適用しています。こうした柔軟な条件分岐ができることにより、プログラムの用途に合わせた最適なエラーハンドリングが行えます。たとえば、業務アプリで管理者のみ詳細ログを残す、特定の曜日にだけ行う集計処理中のエラーを分岐したいなど、現場で役立つ多くのシナリオに活かすことができます。
● try-catch-whenの実践活用シーン
実務では、try-catch-when構文は特に次のような場面で活躍します。 ・API通信や外部サービス利用時に、戻り値やステータスコードによって再試行回数を調整したい ・ログ出力を環境によって切り替えたい(本番だけ詳細ログを記録するなど) ・ユーザーの操作状況に応じてエラー表示内容を変更したい ・ファイル操作でフォルダ名や拡張子によって対応を分岐したい こうした複雑な分岐でも、try-catch-whenを使うことでシンプルにまとめることができ、コードの保守性を向上させることができます。
先生と生徒の振り返り会話
生徒
「先生、今日のtry-catch-whenの説明で、例外処理ってこんなに細かく制御できるんだって驚きました!」
先生
「そうなんです。単にエラーを捕まえるだけじゃなく、状況に応じた最適な対応を選べるのがこの構文の大きな特徴ですよ。」
生徒
「たとえば管理者だけ特別なメッセージを表示したり、曜日や時間帯で処理を変えたりできるって、実務でもかなり便利そうですね。」
先生
「そのとおりです。特にログ関連やファイル処理、外部サービスを使ったアプリでは大活躍します。条件に応じて例外を捕まえることで、無駄な処理を減らせるのも魅力です。」
生徒
「今日のまとめコードを見て、もっと応用してみたくなりました!自分でも条件を色々変えて試してみます!」
先生
「ぜひ色々試してみてください。try-catch-whenは慣れるほど使いやすくなりますよ。状況に応じたエラーハンドリングが自然に書けるようになります。」