第6章: C#の例外処理

プログラムを実行中に発生する予期しないエラーや問題に対応するために、C#には例外処理という機能があります。例外処理を理解し、適切に活用することで、コードの信頼性と堅牢性を向上させることができます。ここでは、例外処理の基本概念とともに、C#の例外処理における主要な構造である try-catch 構文、例外のスローとキャッチ、そして finally ブロックについて詳細に解説します。


6.1 try-catch構造

C#で例外処理を行うための基本構造が try-catch 文です。この構造では、エラーが発生する可能性のあるコードを try ブロックに書き、エラーが発生した場合に実行される処理を catch ブロックに書きます。try ブロック内で例外が発生すると、その時点で処理が中断され、直ちに対応する catch ブロックに処理が移ります。

以下に、基本的な try-catch の例を示します。

try
{
int[] numbers = { 1, 2, 3 };
Console.WriteLine(numbers[5]); // インデックス範囲外のエラーを発生させる
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("エラー: 配列のインデックスが範囲外です。");
Console.WriteLine("詳細: " + ex.Message);
}

上記の例では、try ブロック内でインデックス範囲外のエラーが発生します。このエラーは IndexOutOfRangeException という特定の例外型に該当するため、catch ブロック内でこの例外を捕捉し、適切なエラーメッセージを表示します。

6.1.1 複数のcatchブロック

try ブロックに複数のエラーが発生する可能性がある場合、複数の catch ブロックを使って、異なる種類の例外に対して個別の処理を行うことができます。C#では、より具体的なエラーの種類から順に catch ブロックが評価されるため、一般的な Exception は最後に記述します。

try
{
int number = int.Parse("ABC"); // 数値への変換エラーを発生させる
}
catch (FormatException ex)
{
Console.WriteLine("エラー: 数値形式が無効です。");
}
catch (Exception ex)
{
Console.WriteLine("一般的なエラーが発生しました。");
}

この例では、最初の catch ブロックが FormatException に対応し、数値形式の変換エラーをキャッチします。それ以外のすべての例外は次の catch ブロックで捕捉され、エラーメッセージを表示します。


6.2 例外のスローとキャッチ

C#では、意図的に例外を発生させることも可能です。これは、処理が異常な状態にあることを他のコードに知らせるために便利です。例外をスローするには、throw キーワードを使用します。例えば、特定の条件が満たされない場合に例外をスローし、そのエラーをキャッチするコードを書くことができます。

public static void CheckAge(int age)
{
if (age < 18)
{
throw new ArgumentOutOfRangeException("age", "年齢は18歳以上である必要があります。");
}
Console.WriteLine("年齢は基準を満たしています。");
}

try
{
CheckAge(15); // 18歳未満なので例外をスローする
}
catch (ArgumentOutOfRangeException ex)
{
Console.WriteLine("エラー: " + ex.Message);
}

上記の例では、CheckAge メソッドが引数 age を受け取り、18歳未満であれば ArgumentOutOfRangeException をスローします。try ブロック内でこのメソッドを呼び出し、条件を満たさない年齢(15歳)を渡すと、例外が発生して catch ブロックでキャッチされます。

6.2.1 再スロー

例外の再スロー(rethrow)も可能です。特定の処理を行った後に例外を再度スローして、上位の呼び出し元でさらに詳細なエラーハンドリングを行いたい場合に役立ちます。再スローするには、throw キーワードを単独で使います。

try
{
CheckAge(15);
}
catch (ArgumentOutOfRangeException ex)
{
Console.WriteLine("エラーが発生しました。");
throw; // 例外を再スローする
}

6.3 finallyブロックの使用

try-catch 構造には、finally ブロックを追加することができます。finally ブロックは、例外の発生に関わらず必ず実行されるコードを含む場所です。主に、リソースの解放やクリーンアップ処理に使用されます。たとえば、ファイルのストリームやデータベース接続を閉じる処理などが finally ブロックで行われます。

以下に、finally ブロックの基本的な例を示します。

FileStream file = null;

try
{
file = new FileStream("example.txt", FileMode.Open);
// ファイル処理のコード
}
catch (FileNotFoundException ex)
{
Console.WriteLine("エラー: ファイルが見つかりませんでした。");
}
finally
{
if (file != null)
{
file.Close(); // ファイルが存在する場合は必ず閉じる
}
Console.WriteLine("ファイル処理が終了しました。");
}

上記の例では、ファイルが見つからなかった場合でも finally ブロック内のコードが実行されます。これにより、ファイルリソースが適切に閉じられるため、メモリリークや他のリソース関連の問題が防止されます。

6.3.1 try-catch-finallyの組み合わせ

trycatchfinally のすべてを組み合わせると、エラー発生時の処理、例外がキャッチされた場合の特定の処理、そしてリソースのクリーンアップ処理まで一連の流れをカバーできます。これは多くのアプリケーションで、安定性を向上させるための標準的な例外処理構造です。

try
{
Console.WriteLine("計算を開始します。");
int result = 10 / int.Parse("0"); // 整数のゼロ除算エラーを発生させる
}
catch (DivideByZeroException ex)
{
Console.WriteLine("エラー: ゼロによる除算は許可されていません。");
}
catch (FormatException ex)
{
Console.WriteLine("エラー: 不正な形式の入力がありました。");
}
finally
{
Console.WriteLine("計算処理が完了しました。");
}

この例では、try ブロックでゼロ除算エラーと形式エラーをキャッチし、それに続いて finally ブロックで計算処理が終了したことを必ず出力しています。これにより、プログラムの実行が中断されることなく、終了処理が確実に行われます。


まとめ

C#の例外処理では、try-catch 構造を使用してエラーを管理し、プログラムが予期しないエラーで停止しないようにします。例外のスローとキャッチは、異常な条件に対処するための重要な技術です。また、finally ブロックは、エラーの有無にかかわらず実行する必要があるコードを配置するための役割を担っています。

これらの技術を適切に活用することで、堅牢で信頼性の高いコードを作成し、予期せぬエラーからアプリケーションを守ることができます。


初心者におすすめ!プログラミングスクールのススメ

未経験でも気軽に!サブスク型プログラミングスクール【Freeks】

プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。

独学の挫折率、驚きの87.5%!

独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。

有料と無料、スクールの違いは?

プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:

  • 受講条件が異なる
  • 学べるスキルやカリキュラム内容が異なる
  • 就職や転職のサポート内容が異なる

どちらが自分に合っているか、よく考えて選ぶのが大事です。

サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!

プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:

  • 未経験者向けのわかりやすいカリキュラム
  • 経験豊富なエンジニアのサポート
  • オンラインで自分のペースで学習可能

なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。

終了後は副業もサポート!

カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。

独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
 ↓ ↓ こちらをクリック ↓ ↓ 

p-school

Recent Posts

第6章: PHPのデータベース操作

PHPを使用してデータベースに…

2週間 ago

第5章: PHPのオブジェクト指向プログラミング(OOP)

オブジェクト指向プログラミング…

2週間 ago

第4章: PHPの関数

プログラミングにおいて、関数は…

2週間 ago

第3章: PHPの配列とコレクション

PHPでの配列とコレクションの…

2週間 ago

第2章: PHPの基本文法

PHPの基本的な構文や使い方を…

2週間 ago