C# 6.0 以降では、例外処理に「例外フィルター(when句)」を使えるようになりました。これにより、catch
ブロックに条件を付与して、特定の条件下でのみ例外を捕捉できます。複雑な条件分岐を catch
内で書く必要がなくなり、コードがすっきりするのがメリットです。本記事では例外フィルターの基本的な使い方を解説します。
従来のエラー処理
例外を捕捉した後に if
で条件分岐を行うのが一般的でした。
try
{
int.Parse("abc");
}
catch (FormatException ex)
{
if (ex.Message.Contains("Input string"))
{
Console.WriteLine("文字列を数値に変換できませんでした。");
}
else
{
throw; // 条件に合わなければ再スロー
}
}
この方法でも動作しますが、catch
内が冗長になりがちです。
when句による例外フィルター
例外フィルターを使うと、catch
の宣言部分で条件を付けられます。
try
{
int.Parse("abc");
}
catch (FormatException ex) when (ex.Message.Contains("Input string"))
{
Console.WriteLine("文字列を数値に変換できませんでした。");
}
この場合、ex.Message
に条件が一致する場合のみ捕捉され、それ以外はスローされます。
複数条件での使い分け
when
句を使えば、同じ例外型でも条件に応じて処理を分けることができます。
try
{
int.Parse("12345678901234567890"); // 桁数オーバー
}
catch (FormatException ex) when (ex.Message.Contains("Input string"))
{
Console.WriteLine("フォーマットエラー: 数値以外の文字が含まれています。");
}
catch (OverflowException ex) when (ex.Message.Contains("too large"))
{
Console.WriteLine("オーバーフローエラー: 数値が大きすぎます。");
}
例外フィルターのメリット
- コードが簡潔になる:
catch
内で条件分岐を書く必要がない - ログ出力や限定的なリカバリ処理に便利: 特定条件のみ処理し、それ以外はスローできる
- 例外オブジェクトの状態を活用: メッセージやカスタムプロパティに基づいて分岐可能
注意点
– when
条件が false
の場合、例外は次の catch
へ流れます。該当する catch
がなければ例外はスローされ続けます。
– 例外フィルター内で副作用のある処理を書くのは避けるべきです。条件判定に徹するのが望ましいです。
まとめ
例外フィルター(when句)は、条件付きで例外を捕捉できる便利な仕組みです。
catch (...) when (条件)
で特定条件のみ捕捉可能- 同じ例外型を複数の条件で使い分けられる
- エラーハンドリングのコードがすっきりし、可読性が向上する
複雑な例外処理を整理する際には、ぜひ例外フィルターを活用してみましょう。