C#の例外処理の基本!try-catch-finally構文をやさしく解説
生徒
「プログラムでエラーが出たときに止まらないようにする方法ってあるんですか?」
先生
「ありますよ。C#では『例外処理』という仕組みを使って、エラーに対応できます。」
生徒
「難しそうですね…。初心者でもわかるように教えてもらえますか?」
先生
「もちろんです!まずは基本的な構文『try-catch-finally』を一緒に見ていきましょう。」
1. 例外処理とは?
プログラミングをしていると、予期しないエラーが発生することがあります。例えば、数字を0で割ってしまったり、存在しないファイルを開こうとしたりする場合です。こういったエラーを放置すると、プログラムが強制終了してしまいます。
そんなときに使うのが、C#の例外処理です。例外(エラー)が起きたときに、プログラムの流れを止めず、安全に対処できるようにします。
2. try-catch-finally構文とは?
C#では、例外を処理するためにtry-catch-finally構文を使います。
それぞれの役割は以下のとおりです:
- try:エラーが起こるかもしれない処理を書く
- catch:実際にエラーが起きたときの対応を書く
- finally:エラーが起きても起きなくても、最後に必ず実行される処理を書く(省略可能)
3. 実際の例を見てみよう
次の例は、0で割り算をしようとしてエラーになるケースです。try-catch構文を使ってエラーをキャッチし、プログラムが止まらないようにします。
int number1 = 10;
int number2 = 0;
try
{
int result = number1 / number2;
Console.WriteLine("結果: " + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
このコードを実行すると、次のような結果が表示されます。
エラーが発生しました: ゼロで除算しようとしました。
4. finallyで「最後の処理」を書く
finallyブロックは、例外が発生してもしなくても、必ず最後に実行される部分です。たとえば、ファイルやデータベースの接続を閉じる処理などをここに書きます。
try
{
Console.WriteLine("処理を開始します。");
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[5]); // 存在しないインデックス
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("配列の範囲外にアクセスしました: " + ex.Message);
}
finally
{
Console.WriteLine("finallyブロックが実行されました。");
}
処理を開始します。
配列の範囲外にアクセスしました: インデックスが配列の範囲を超えています。
finallyブロックが実行されました。
5. どんなときに使うの?
例外処理は、ユーザー入力を扱う場面や、ファイルを読み込む、インターネット通信など、予測できないエラーが起こる可能性がある部分で使います。
例外処理をしないと、プログラムが突然終了してしまい、ユーザーにとって使いにくいアプリになります。try-catch-finallyを使えば、エラーが起きても丁寧に対応できる、安心・安全なプログラムを作ることができます。
6. よくある例外の種類
C#では、発生するエラーに応じて、さまざまな「例外クラス」が用意されています。catch文では、特定のエラーだけを処理するように分けることも可能です。
DivideByZeroException:0で割り算しようとしたIndexOutOfRangeException:配列の範囲外を参照したFormatException:文字列から数値への変換に失敗したFileNotFoundException:存在しないファイルを開こうとした
7. 複数のcatchを使う
複数の種類のエラーに対応したいときは、catch文を複数書くことができます。
try
{
string input = "abc";
int number = int.Parse(input); // 数字に変換できない
}
catch (FormatException)
{
Console.WriteLine("数字に変換できませんでした。");
}
catch (Exception ex)
{
Console.WriteLine("その他のエラーが発生しました: " + ex.Message);
}
数字に変換できませんでした。
Exceptionクラスは、すべての例外の「親」にあたるクラスなので、最後に書くようにしましょう。
8. catchの中でエラー内容を詳しく知るには?
catchのあとに書かれる(Exception ex)のような記述では、発生したエラーの情報を変数exに受け取ることができます。ex.Messageでエラー内容を表示できるので、ログに残したり、ユーザーに伝えたりするのに役立ちます。
まとめ
C#での例外処理は、初心者がつまずきやすいポイントのひとつですが、実はとても実用的で重要な仕組みです。特に「try-catch-finally構文」は、エラーに強い安定したプログラムを作るうえで欠かせない技法です。実際の開発現場では、予期せぬ例外が必ずといっていいほど発生します。そうした場合に備えて、あらかじめtryブロックに処理を囲い、catchでエラーに対応し、finallyで後始末をするのが基本的な流れとなります。
たとえば、数値の割り算で0を除数にしてしまったり、ユーザーの入力ミスで文字列を数値に変換できなかったり、ファイルが存在しなかったりすることはよくあります。こうしたよくある例外には、それぞれDivideByZeroException、FormatException、FileNotFoundExceptionなどの専用クラスが用意されており、catch文で個別に対処できます。
また、複数のcatch文を使うことで、異なる種類の例外ごとに適切な処理を行うことができます。これは現場でも非常によく使われるテクニックであり、Exceptionクラスを最後に書くことで他の例外クラスよりも後に処理されるよう配慮する必要があります。
finallyブロックの使いどころも忘れてはいけません。たとえばファイルを開いたあとに必ず閉じたい場合や、データベースの接続を終了させたい場合など、どんな状況でも必ず実行してほしい処理を入れておく場所です。例外の有無にかかわらず実行されるので、リソースの解放処理などに活用されます。
ここで、例外処理全体を組み合わせたコード例を示します。
try
{
Console.WriteLine("計算を開始します");
int a = 10;
int b = 0;
int result = a / b;
Console.WriteLine("結果: " + result);
}
catch (DivideByZeroException ex)
{
Console.WriteLine("0で割ることはできません: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("その他のエラーが発生しました: " + ex.Message);
}
finally
{
Console.WriteLine("処理を終了しました。");
}
このように、C#の例外処理構文を正しく使うことで、予測できないトラブルにも柔軟に対応できる堅牢なプログラムを構築できます。ユーザーにとって安心して使えるアプリケーションを提供するためにも、エラー処理の基本をしっかり理解し、日々の開発に役立てていきましょう。
生徒
「try-catch-finallyって最初は難しそうだったけど、使い方がわかってきました!」
先生
「そうだね、最初は戸惑うかもしれないけど、例外処理は実はとても実用的で重要な機能なんだよ。」
生徒
「finallyで必ず最後に実行される処理があるのも安心ですね。」
先生
「そのとおり。リソースの後片付けにはぴったりだね。catchの中ではエラーの詳細をログに出せるし、ユーザーへのメッセージも工夫できるよ。」
生徒
「例外クラスにもいろいろな種類があるんですね。用途に合わせてcatch文を分けるのが大事なんですね!」
先生
「その通り。FormatException、DivideByZeroException、IndexOutOfRangeExceptionなど、よく使う例外クラスは覚えておくと便利だよ。」
生徒
「今度からは例外が出ても焦らず、try-catchで対処できるようにがんばります!」
先生
「よくできました!今学んだ内容は実践で必ず役立つよ。」