C#の例外処理構造と制御フローの違いをやさしく解説!初心者でも理解できる基本知識
生徒
「C#の制御フローと例外処理って、どう違うんですか?」
先生
「いい質問ですね。どちらもプログラムの流れをコントロールするために使いますが、目的や使い方が異なりますよ。」
生徒
「なんだか難しそう…。初心者にもわかりやすく教えてもらえますか?」
先生
「もちろんです!簡単なたとえを使いながら、基礎からしっかり解説しますね。」
1. 制御フローとは?
C#の制御フローとは、プログラムの命令をどの順番で実行するかを決める仕組みのことです。代表的なものには、if文、for文、while文、switch文などがあります。
たとえば、「もし〇〇なら〜する」とか、「10回同じことを繰り返す」といった処理の流れを決めるために使います。
具体的な例を見てみましょう。
int number = 5;
if (number > 0)
{
Console.WriteLine("正の数です。");
}
正の数です。
この例では、変数numberが0より大きければ「正の数です。」と表示されます。これが制御フローです。
2. 例外処理とは?
例外処理は、プログラム中で「予期しないエラー」が発生したときに、そのエラーをキャッチして、プログラムを止めずに対処する仕組みです。
例えば、ゼロで割ったり、存在しないファイルを開こうとしたときにエラーになりますよね。それを例外(エラー)と呼び、try〜catchブロックを使って処理します。
以下の例を見てみましょう。
try
{
int x = 10;
int y = 0;
int result = x / y;
Console.WriteLine(result);
}
catch (DivideByZeroException)
{
Console.WriteLine("ゼロで割ることはできません。");
}
ゼロで割ることはできません。
このコードでは、10 ÷ 0 という計算が例外を発生させますが、catchブロックで受け止めて、エラーメッセージを表示しています。
3. 制御フローと例外処理の違い
ここまでで、それぞれの使い方がわかりましたね。それでは、制御フローと例外処理の違いを整理してみましょう。
- 制御フロー:プログラムの通常の流れを制御(分岐や繰り返し)する。
- 例外処理:エラーが発生したときに、プログラムが止まらないようにする。
たとえるなら、制御フローは「信号機」や「交差点」で進む道を決めるようなもの。例外処理は「事故」が起きたときに、救急車や警察が対応する仕組みに近いです。
4. try-catch-finallyの基本構造
C#では、例外処理に使う構文としてtry〜catch〜finallyがあります。それぞれの役割は以下の通りです。
try:例外が起きるかもしれない処理を書く。catch:例外が起きたときに実行する処理。finally:例外の有無にかかわらず、最後に必ず実行される処理。
try
{
// 例外が起こる可能性のあるコード
}
catch (Exception ex)
{
// 例外が起きたときの処理
}
finally
{
// 最後に必ず実行される処理
}
finallyは、たとえばファイルや接続の後始末など、「絶対に実行してほしい処理」を書くときに使います。
5. 例外処理のないコードの危険性
例外処理をしないと、エラーが発生した時にプログラムが途中で止まってしまいます。
int[] array = { 1, 2, 3 };
Console.WriteLine(array[5]);
System.IndexOutOfRangeException: インデックスが配列の範囲外です。
このように、配列の範囲外にアクセスすると例外が発生し、プログラムはクラッシュします。例外処理はプログラムの安全性を高めるために必須です。
6. よく使う例外クラス
C#では、さまざまな例外クラスが用意されています。以下はよく使われる例外の一部です。
DivideByZeroException:ゼロで割ったときIndexOutOfRangeException:配列などのインデックスが範囲外NullReferenceException:nullの値にアクセスしようとしたときFileNotFoundException:指定したファイルが存在しないとき
このような例外をcatchブロックで指定することで、より的確なエラー処理ができます。
7. 例外処理と制御フローを組み合わせた例
最後に、例外処理と制御フローを組み合わせた簡単なサンプルを紹介します。
for (int i = 0; i < 3; i++)
{
try
{
Console.Write("割られる数を入力してください:");
int x = int.Parse(Console.ReadLine());
Console.Write("割る数を入力してください:");
int y = int.Parse(Console.ReadLine());
Console.WriteLine("結果:" + (x / y));
}
catch (DivideByZeroException)
{
Console.WriteLine("0では割れません。もう一度やり直してください。");
}
}
for文(制御フロー)で繰り返しを行い、その中でtry-catchを使って例外を処理しています。