【C#】例外フィルター(when句)を使ったエラー処理の書き方

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 (条件) で特定条件のみ捕捉可能
  • 同じ例外型を複数の条件で使い分けられる
  • エラーハンドリングのコードがすっきりし、可読性が向上する

複雑な例外処理を整理する際には、ぜひ例外フィルターを活用してみましょう。