C#(シーシャープ)は、エラー処理と例外処理を非常に重要視しています。プログラムが実行されている間に予期しない問題が発生する可能性があり、これらの問題を適切に処理しないと、アプリケーションがクラッシュしたり、不安定になったりすることがあります。そのため、C#では「例外処理(Exception Handling)」の概念が取り入れられており、これを活用することでエラーが発生した場合でもアプリケーションを安定して動作させることができます。
この記事では、C#における例外処理の基本、例外の種類、例外を処理する方法、さらに最良の実践方法について詳しく解説します。

1. 例外とは?
C#における「例外(Exception)」は、プログラムの実行中に発生する予期しないエラーを指します。これには、データベース接続の失敗、ファイルの読み込みエラー、ネットワークの問題など、さまざまな問題が含まれます。これらの問題は、アプリケーションが正常に動作するための前提条件が満たされていないときに発生します。
C#では、エラーが発生すると「例外」がスローされ、これを捕まえて処理することでエラーを管理します。
2. 例外処理の基本構文
C#では、例外を処理するために try
、catch
、finally
ブロックを使用します。基本的な構文は次のようになります:
csharptry
{
// 例外が発生するかもしれない処理
}
catch (Exception ex)
{
// 例外が発生した場合の処理
Console.WriteLine("エラーが発生しました: " + ex.Message);
}
finally
{
// 例外の有無にかかわらず必ず実行される処理
Console.WriteLine("終了処理");
}
-
try
ブロック: ここにエラーが発生する可能性があるコードを記述します。 -
catch
ブロック: 例外が発生した場合、このブロックが実行されます。Exception
オブジェクトを使ってエラー情報を取得することができます。 -
finally
ブロック: 例外が発生したかどうかに関わらず必ず実行されるコードを記述します。例えば、リソースの解放やファイルのクローズ処理などです。
3. 例外の種類
C#では、標準ライブラリに数多くの例外クラスが用意されています。代表的なものには以下があります:
-
System.Exception
: すべての例外の基底クラスです。ほとんどの例外クラスはこのクラスを継承しています。 -
System.NullReferenceException
: オブジェクトがnullである場合に発生します。 -
System.DivideByZeroException
: 0で割る演算が行われた場合に発生します。 -
System.IO.IOException
: ファイルやストリームの操作中にエラーが発生した場合に発生します。 -
System.FormatException
: データの形式が無効な場合に発生します。 -
System.IndexOutOfRangeException
: 配列のインデックスが範囲外の場合に発生します。
これらの例外は、通常、特定の状況に対応するためにキャッチされ、適切に処理されます。
4. 例外を明示的にスローする
時には、プログラム内で自分自身が例外をスローする必要がある場合があります。C#では、throw
キーワードを使用して例外をスローすることができます。
csharpif (x < 0)
{
throw new ArgumentException("xは0以上でなければなりません");
}
上記の例では、変数 x
が0未満の場合に ArgumentException
をスローします。このようにして、特定の条件下でエラーを発生させることができます。
5. 例外を捕まえる複数の catch
ブロック
複数の異なる種類の例外を処理する場合、catch
ブロックを複数使用することができます。例外の種類によって異なる処理を実行することができます。
csharptry
{
int[] arr = new int[5];
arr[10] = 100; // IndexOutOfRangeExceptionを発生させる
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("インデックスが範囲外です: " + ex.Message);
}
catch (Exception ex)
{
Console.WriteLine("その他のエラーが発生しました: " + ex.Message);
}
このコードでは、IndexOutOfRangeException
が発生した場合、最初の catch
ブロックが実行され、それ以外の例外は2番目の catch
ブロックで処理されます。
6. 例外の伝播
C#では、例外はスタックトレースに沿って「伝播」していきます。つまり、あるメソッド内で例外が発生してキャッチされなかった場合、例外は呼び出し元のメソッドに伝播します。もし呼び出し元でキャッチされなければ、さらにその上のメソッドに伝播していき、最終的にプログラム全体で例外が捕らえられない場合、アプリケーションはクラッシュします。
これを防ぐために、適切な場所で例外をキャッチして処理することが重要です。
7. 例外の最適な取り扱い方法
-
不要な例外の捕捉を避ける: 全ての例外を一律にキャッチするのではなく、予想されるエラーだけをキャッチしましょう。例えば、
catch (Exception ex)
ではなく、特定の例外クラスをキャッチする方が良いです。 -
ログを取る: 例外が発生した場合、エラーの詳細をログに記録することが重要です。これにより、問題の診断や修正がしやすくなります。
-
再スローする: 場合によっては、例外をキャッチした後に再スローすることがあります。これは、例外の処理を上位に委ねる場合に有効です。
csharpcatch (Exception ex)
{
// ログを記録
Console.WriteLine("エラー: " + ex.Message);
// 例外を再スロー
throw;
}
8. まとめ
C#での例外処理は、プログラムの安定性と信頼性を高めるための重要な手段です。予期しないエラーに対処するために、try-catch
構文を適切に使用し、エラー発生時にはエラーメッセージの表示、ログの記録、適切な後処理を行いましょう。また、複雑なアプリケーションでは、エラーの伝播と再スローを適切に利用することで、より良いエラーハンドリングを実現できます。