C#でファイル読み書き時の例外処理を行う方法(try-catch)をやさしく解説!
生徒
「先生、C#でファイルを読み書きしているときに、突然エラーが出て止まってしまうことがあるんですが、どうすればいいですか?」
先生
「いい質問ですね。C#では『例外処理(れいがいしょり)』という仕組みを使うことで、プログラムが止まらないように安全にエラーを処理することができますよ。」
生徒
「例外処理ってなんですか?難しそうです…」
先生
「大丈夫!簡単に言うと、プログラムで何か問題が起きたときに、代わりに対処方法を用意しておくことなんです。今回は、ファイルを読み書きする時に『try-catch文』を使って例外処理をする方法を見ていきましょう。」
1. 例外処理とは?(try-catchの基本)
プログラムを実行しているときに、ファイルが見つからなかったり、他のアプリが使っていて開けなかったりすることがあります。こうした想定外のエラーを「例外(Exception)」と呼びます。
C#では、try-catch文を使って例外をキャッチ(捕まえる)し、エラーが起きてもプログラムが強制終了しないようにすることができます。
try-catch文の基本構文
try
{
// エラーが起きるかもしれない処理
}
catch (Exception ex)
{
// エラーが起きた時の処理
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
tryの中には、エラーが起こるかもしれない処理を入れます。そして、何か問題が起きたときには、catchの中の処理が実行されます。ex.Messageを使うと、どんなエラーが起こったのかを画面に表示できます。
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. ファイル書き込み時の例外処理
次に、ファイルへ書き込むときの例外処理を見てみましょう。たとえば、読み取り専用のフォルダに書き込もうとしたり、ファイルが他のアプリで開かれていた場合にもエラーが発生します。
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ブロックで後片付けをする
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. 初心者が覚えておくべきポイント
- try-catchは、エラーを安全に処理するための仕組み。
- ファイル操作では、
FileNotFoundExceptionやIOExceptionなどがよく使われる。 - 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で理由を伝えられるのが便利ですね!現実のトラブルにも応用できそうです。」
先生
「その通りです。今回覚えた例外の扱い方は、ファイル操作だけでなく、ネットワーク通信やデータベースでも役に立ちますよ。これからもっと複雑な処理を学ぶときにも、今回の知識が必ず助けになります。」
生徒
「はい!エラーを恐れずに、落ち着いて対処できるようになりたいです。次の学習も楽しみです!」