カテゴリ: C# 更新日: 2025/12/05

C#でファイル読み書き時の例外処理を行う方法(try-catch)をやさしく解説!

C#でファイル読み書き時の例外処理を行う方法(try-catch)
C#でファイル読み書き時の例外処理を行う方法(try-catch)

先生と生徒の会話形式で理解しよう

生徒

「先生、C#でファイルを読み書きしているときに、突然エラーが出て止まってしまうことがあるんですが、どうすればいいですか?」

先生

「いい質問ですね。C#では『例外処理(れいがいしょり)』という仕組みを使うことで、プログラムが止まらないように安全にエラーを処理することができますよ。」

生徒

「例外処理ってなんですか?難しそうです…」

先生

「大丈夫!簡単に言うと、プログラムで何か問題が起きたときに、代わりに対処方法を用意しておくことなんです。今回は、ファイルを読み書きする時に『try-catch文』を使って例外処理をする方法を見ていきましょう。」

1. 例外処理とは?(try-catchの基本)

1. 例外処理とは?(try-catchの基本)
1. 例外処理とは?(try-catchの基本)

プログラムを実行しているときに、ファイルが見つからなかったり、他のアプリが使っていて開けなかったりすることがあります。こうした想定外のエラーを「例外(Exception)」と呼びます。

C#では、try-catch文を使って例外をキャッチ(捕まえる)し、エラーが起きてもプログラムが強制終了しないようにすることができます。

try-catch文の基本構文


try
{
    // エラーが起きるかもしれない処理
}
catch (Exception ex)
{
    // エラーが起きた時の処理
    Console.WriteLine("エラーが発生しました: " + ex.Message);
}

tryの中には、エラーが起こるかもしれない処理を入れます。そして、何か問題が起きたときには、catchの中の処理が実行されます。ex.Messageを使うと、どんなエラーが起こったのかを画面に表示できます。

2. ファイル読み込み時の例外処理

2. ファイル読み込み時の例外処理
2. ファイル読み込み時の例外処理

たとえば、存在しないファイルを読み込もうとすると、C#では「FileNotFoundException(ファイルが見つからない例外)」が発生します。これをtry-catchで安全に処理してみましょう。


using System;
using System.IO;

class Program
{
    static void Main()
    {
        try
        {
            string text = File.ReadAllText("data.txt");
            Console.WriteLine(text);
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("ファイルが見つかりません。ファイル名を確認してください。");
        }
        catch (UnauthorizedAccessException)
        {
            Console.WriteLine("ファイルへのアクセスが許可されていません。");
        }
        catch (Exception ex)
        {
            Console.WriteLine("予期せぬエラーが発生しました: " + ex.Message);
        }
    }
}

この例では、まずFile.ReadAllTextでファイルを読み込みます。ファイルが存在しない場合はFileNotFoundException、権限がない場合はUnauthorizedAccessExceptionが発生します。それぞれに合わせたメッセージを出すことで、ユーザーに優しくエラー内容を伝えることができます。

実行結果(ファイルが存在しない場合)


ファイルが見つかりません。ファイル名を確認してください。

3. ファイル書き込み時の例外処理

3. ファイル書き込み時の例外処理
3. ファイル書き込み時の例外処理

次に、ファイルへ書き込むときの例外処理を見てみましょう。たとえば、読み取り専用のフォルダに書き込もうとしたり、ファイルが他のアプリで開かれていた場合にもエラーが発生します。


using System;
using System.IO;

class Program
{
    static void Main()
    {
        try
        {
            File.WriteAllText("output.txt", "こんにちは、C#ファイル操作の世界!");
            Console.WriteLine("ファイルの書き込みが成功しました。");
        }
        catch (UnauthorizedAccessException)
        {
            Console.WriteLine("ファイルに書き込む権限がありません。");
        }
        catch (IOException ex)
        {
            Console.WriteLine("入出力エラーが発生しました: " + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("不明なエラーが発生しました: " + ex.Message);
        }
    }
}

ここではFile.WriteAllTextを使って文字を書き込んでいますが、失敗した場合に備えて複数のcatchで細かくエラーを分けて処理しています。こうすることで、原因を特定しやすくなり、トラブル対応がスムーズになります。

実行結果(正常に書き込めた場合)


ファイルの書き込みが成功しました。

4. finallyブロックで後片付けをする

4. finallyブロックで後片付けをする
4. finallyブロックで後片付けをする

try-catchには、もう一つ便利な機能があります。それがfinallyブロックです。finallyは、エラーが起きても起きなくても必ず実行される部分です。ファイルを閉じたり、リソース(使ったメモリやデータ)を解放したりするのに使われます。


using System;
using System.IO;

class Program
{
    static void Main()
    {
        StreamReader reader = null;
        try
        {
            reader = new StreamReader("sample.txt");
            string content = reader.ReadToEnd();
            Console.WriteLine(content);
        }
        catch (Exception ex)
        {
            Console.WriteLine("エラー: " + ex.Message);
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
                Console.WriteLine("ファイルを閉じました。");
            }
        }
    }
}

このようにfinallyを使うことで、どんな状況でもファイルを確実に閉じることができ、安全にプログラムを終了できます。ファイル操作では特に重要なテクニックです。

5. 初心者が覚えておくべきポイント

5. 初心者が覚えておくべきポイント
5. 初心者が覚えておくべきポイント
  • try-catchは、エラーを安全に処理するための仕組み。
  • ファイル操作では、FileNotFoundExceptionIOExceptionなどがよく使われる。
  • finallyを使うと、エラーがあっても後処理を確実に行える。
  • 例外の種類を分けてキャッチすると、原因がわかりやすくなる。
  • エラー内容をex.Messageで表示すると、デバッグ(原因調査)がしやすい。

例外処理を理解しておくことで、ファイル操作だけでなく、ネットワーク通信やデータベースなど、さまざまなプログラムでも「安全に」エラーを処理できるようになります。

まとめ

まとめ
まとめ

ここまで、C#でファイルを読み書きするときに発生するさまざまな例外を、安全に処理するための考え方や手順を学びました。特に、ファイル操作では予期しないトラブルが非常に起こりやすく、ファイルの場所が違っていたり名前を打ち間違えていたり、権限が足りなかったり、ほかのアプリにファイルが使われていて開けなかったりと、多くの場面で例外が発生します。そのような場面でプログラムが突然停止してしまうと、ユーザーは何が起きたか分からず不安になりますし、開発者としても意図しない動作を避けるために例外処理は欠かせません。

C#における例外処理の中心となるのがtry-catch文です。エラーが起きる可能性のある処理をtryに書き、そのエラーに対応する処理をcatchに書くことで、問題が起きても適切な対応ができるようになります。例外の種類ごとにcatchを分けておけば原因特定もしやすくなり、ユーザーへのメッセージもより丁寧に伝えられます。また、必ず実行したい処理をまとめるfinallyを使うことで、ファイルの閉鎖やリソースの解放を確実に行える点も重要なポイントでした。

さらに実際の開発では、例外処理を適切に書くことで「どこで何が起きたのか」が分かりやすくなり、修正もしやすくなります。とくにファイル操作はプログラムが扱う外部リソースのため、開発者が完全に状態を把握できない部分が多く、例外処理がほぼ必須となります。今回の学びをそのまま応用すれば、ログ管理やデータ保存、設定ファイルの操作などでも安心してプログラムを作れるはずです。

ここで、例外処理の流れを再確認できるサンプルコードを掲載します。学んだ内容を整理するためにも、ぜひ実際に手を動かしながら動作を確かめてみてください。


using System;
using System.IO;

class SummaryExample
{
    static void Main()
    {
        string path = "example.txt";
        StreamReader reader = null;

        try
        {
            Console.WriteLine("ファイルを読み込もうとしています…");
            reader = new StreamReader(path);
            string content = reader.ReadToEnd();
            Console.WriteLine("読み込み成功:");
            Console.WriteLine(content);
        }
        catch (FileNotFoundException)
        {
            Console.WriteLine("指定されたファイルが見つかりませんでした。名前や場所を確かめてください。");
        }
        catch (UnauthorizedAccessException)
        {
            Console.WriteLine("ファイルへアクセスできません。権限を確認してください。");
        }
        catch (IOException ex)
        {
            Console.WriteLine("入出力エラーが発生しました: " + ex.Message);
        }
        catch (Exception ex)
        {
            Console.WriteLine("予期しない問題が発生しました: " + ex.Message);
        }
        finally
        {
            if (reader != null)
            {
                reader.Close();
                Console.WriteLine("ファイルを閉じました。処理を終了します。");
            }
        }
    }
}

このサンプルは、例外処理における基本的な考え方を一通り含んでいます。実際の開発でもほぼ同じ形で利用されるため、しっかり理解しておくと大きな強みになります。エラーに振り回されずに、自分の意図した動作へ導くための重要な技術として、例外処理は必ず身につけておきたい知識です。

先生と生徒の振り返り会話

生徒

「先生、例外処理って最初はむずかしそうに思っていたんですが、tryとcatchの役割が分かるとすごく整理しやすく感じました!」

先生

「そうですね。例外処理はプログラムを安全に動かすためのとても大切な技術です。どんなエラーが起きても対応できるようになると安心して開発できますよ。」

生徒

「ファイルが見つからないときやアクセスできないときに、それぞれ別のcatchで理由を伝えられるのが便利ですね!現実のトラブルにも応用できそうです。」

先生

「その通りです。今回覚えた例外の扱い方は、ファイル操作だけでなく、ネットワーク通信やデータベースでも役に立ちますよ。これからもっと複雑な処理を学ぶときにも、今回の知識が必ず助けになります。」

生徒

「はい!エラーを恐れずに、落ち着いて対処できるようになりたいです。次の学習も楽しみです!」

カテゴリの一覧へ
新着記事
New1
C#
C#のLINQでAny・Allなど条件確認メソッドの使い方を完全ガイド!初心者でもわかるデータ検証
New2
C#
C#のデフォルト引数と名前付き引数の使い方を解説!初心者でも安心のやさしい入門
New3
C#
C#のオブジェクト初期化子を完全ガイド!初心者でもわかる便利な使い方
New4
COBOL
COBOLの帳票出力と編集を完全マスター!条件付き表示で分かりやすい書類を作る方法
人気記事
No.1
Java&Spring記事人気No1
C#
C#でJSONファイルを読み書きする方法(JsonSerializer・Newtonsoft.Json)
No.2
Java&Spring記事人気No2
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.3
Java&Spring記事人気No3
C#
C#でswitch式を使う方法!C# 8.0以降の新機能を解説
No.4
Java&Spring記事人気No4
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.5
Java&Spring記事人気No5
C#
C#のLINQクエリ構文の書き方と基本操作をマスターしよう
No.6
Java&Spring記事人気No6
C#
C#のLINQ(リンク)とは?基本概念とデータ操作を初心者向けに徹底解説!
No.7
Java&Spring記事人気No7
C#
C#の非同期処理とUIスレッドをマスター!WPF/WinFormsでアプリが止まる問題を解決
No.8
Java&Spring記事人気No8
C#
C#のCancellationTokenを使ったキャンセル処理を完全ガイド!非同期処理を安全に止める方法