【C#】例外処理の書き方|try-catch-finallyの使い方

プログラム実行中に発生するエラーを適切に処理するために、C# では「例外処理」を使います。例外処理を行わないとエラー発生時にプログラムが強制終了してしまいますが、try-catch-finally 構文を使うことで安全に処理を継続したり、エラーメッセージを出力したりすることができます。本記事ではその基本的な使い方を紹介します。

try-catch の基本

try ブロックにエラーが起こる可能性のある処理を記述し、catch ブロックで例外を受け取って処理します。

try
{
    int x = 10;
    int y = 0;
    int result = x / y; // 0で割ると例外が発生
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("0で割ることはできません: " + ex.Message);
}

この例では、0除算の際に DivideByZeroException が発生し、catch ブロックで処理されます。

複数の catch を使う

発生する可能性のある例外が複数ある場合は、catch を複数並べることができます。より具体的な例外から順に記述します。

try
{
    string text = null;
    Console.WriteLine(text.Length); // NullReferenceException
}
catch (NullReferenceException ex)
{
    Console.WriteLine("ヌル参照エラー: " + ex.Message);
}
catch (Exception ex)
{
    Console.WriteLine("その他の例外: " + ex.Message);
}

finally ブロックの利用

finally ブロックに記述した処理は、例外が発生してもしなくても必ず実行されます。ファイルや接続の解放など、後始末が必要な場合に便利です。

try
{
    Console.WriteLine("処理を開始");
    int[] numbers = { 1, 2, 3 };
    Console.WriteLine(numbers[5]); // 範囲外アクセス
}
catch (IndexOutOfRangeException ex)
{
    Console.WriteLine("配列の範囲外アクセス: " + ex.Message);
}
finally
{
    Console.WriteLine("後始末処理を実行");
}

例外オブジェクトの活用

catch の引数で受け取った例外オブジェクトには、エラーの内容やスタックトレースを確認できるプロパティが含まれています。

try
{
    int.Parse("abc"); // FormatException
}
catch (FormatException ex)
{
    Console.WriteLine("変換エラー: " + ex.Message);
    Console.WriteLine("スタックトレース: " + ex.StackTrace);
}

まとめ

C# の try-catch-finally は以下のように使い分けます。

  • try … 例外が発生する可能性がある処理を記述
  • catch … 発生した例外を捕捉して処理
  • finally … 必ず実行したい後始末処理を記述

適切な例外処理を行うことで、プログラムの信頼性と安定性を高めることができます。