C#のtry-catch構文:エラーに強いコードを書くための基本

プログラムを書いていると、実行時エラーに出会うことがあります。たとえば次のような場面です:

  • 存在しないファイルを読み込もうとした
  • 数値の0で割ろうとした
  • ユーザーが空の入力をした

このような 予期しない事態 をうまく処理できるコードを書くには、C# の try-catch 構文が不可欠です。


try-catchの基本構文

try
{
    // 例外が発生するかもしれない処理
}
catch (例外の型 ex)
{
    // 例外が発生したときの処理
}

実例:0で割るエラーを防ぐ

TryCatchExampleというプロジェクト名で作成してください

int a = 10;
int b = 0;

try
{
    int result = a / b;
    Console.WriteLine("結果:" + result);
}
catch (DivideByZeroException ex)
{
    Console.WriteLine("エラー発生:" + ex.Message);
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TryCatchExample
{
    internal class Program
    {
        static void Main(string[] args)
        {
            int a = 10;
            int b = 0;

            try
            {
                int result = a / b;
                Console.WriteLine("結果:" + result);
            }
            catch (DivideByZeroException ex)
            {
                Console.WriteLine("エラー発生:" + ex.Message);
            }
        }
    }
}

出力結果:

エラー発生:0 で除算しようとしました。

catchは複数書ける

エラーの種類によって処理を分けたいときは、catch を複数用意できます。

try
{
    // 例外が出るかもしれない処理
}
catch (FormatException ex)
{
    Console.WriteLine("フォーマットが正しくありません");
}
catch (Exception ex)
{
    Console.WriteLine("その他のエラー:" + ex.Message);
}

上から順にチェックされるため、具体的な例外→汎用的な Exception の順で書くのがポイントです。


finally句で「後始末」

例外が起きても起きなくても、必ず実行される処理を finally ブロックに書けます。たとえばファイルやDB接続のクローズ処理などです。

StreamReader reader = null;

try
{
    reader = new StreamReader("data.txt");
    string content = reader.ReadToEnd();
    Console.WriteLine(content);
}
catch (FileNotFoundException)
{
    Console.WriteLine("ファイルが見つかりませんでした。");
}
finally
{
    if (reader != null)
        reader.Close();  // ← ここは必ず実行される
}

例外が発生しないコードの書き方も大切

例外処理は「保険」であって、「通常の処理」は if 文などで防げるなら防ぐのがベストです。

if (b != 0)
{
    int result = a / b;
    Console.WriteLine("結果:" + result);
}
else
{
    Console.WriteLine("0では割れません");
}

まとめ

ポイント内容
try例外が起きる可能性のある処理を囲む
catch起きた例外に対して適切に対応する
finally例外の有無にかかわらず実行される後処理
ベストプラクティス予防できるならifなどで回避し、例外は最終手段として扱う

発展:例外の再スロー

catch 内でログだけ取って、上位に投げ直すこともできます。

catch (Exception ex)
{
    Console.WriteLine("ログ:" + ex.Message);
    throw;  // ← もとの例外を再スロー
}

おわりに

try-catch を正しく使うことで、エラーに強く、予測可能なコードを書くことができます。初心者のうちは「全部に try-catch をつける」のではなく、「ここは落ちるかもしれない」というポイントを見極めながら活用していきましょう。


訪問数 3 回, 今日の訪問数 3回

C#,例外

Posted by hidepon