はじめに
プログラムが予期しない状況やエラーに遭遇することは避けられないことです。これらのエラーを適切に処理しないと、プログラムはクラッシュしてしまう可能性があります。C#では、try-catch文を使用して例外を処理し、プログラムが予期しない状況でも安全に動作し続けるようにすることができます。この記事では、C#における例外処理の基本、特にtry-catch文の使い方について詳しく解説します。
例外処理の基本
例外とは何か?
例外とは、プログラムの実行中に発生する予期しない事象やエラーのことです。例外は、プログラムが正常に実行されるのを妨げるエラーを示す特別なオブジェクトです。これには、ファイルが見つからない、ゼロでの除算、ネットワークエラーなどが含まれます。
例外の種類
C#では、例外はSystem.Exceptionクラスを基底クラスとして継承されます。以下に、一般的な例外の種類をいくつか示します。
System.IO.IOException: 入出力エラーを示します。System.DivideByZeroException: ゼロで除算しようとした場合に発生します。System.NullReferenceException: null参照に対して操作を行おうとした場合に発生します。System.IndexOutOfRangeException: 配列やコレクションの範囲外のインデックスにアクセスしようとした場合に発生します。
try-catch文の使い方
基本的な構文
try-catch文は、以下の構文で記述します。
try
{
// 例外が発生する可能性のあるコード
}
catch (ExceptionType ex)
{
// 例外を処理するコード
}
- tryブロック: 例外が発生する可能性のあるコードを囲みます。
- catchブロック: 例外が発生した場合に実行されるコードを含みます。
ExceptionTypeはキャッチしたい例外の型を指定し、exは例外オブジェクトを参照する変数です。
例外のキャッチと処理の例
以下は、ゼロで除算しようとした場合の例外処理の例です。
try
{
int divisor = 0;
int result = 10 / divisor;
}
catch (DivideByZeroException ex)
{
Console.WriteLine("ゼロで除算することはできません。");
Console.WriteLine($"エラーの詳細: {ex.Message}");
}
この例では、DivideByZeroExceptionが発生した場合にキャッチされ、適切なエラーメッセージが表示されます。
複数の例外をキャッチする
複数の種類の例外が発生する可能性がある場合、それぞれの例外を個別にキャッチして処理することができます。
try
{
// 複数の例外が発生する可能性のあるコード
}
catch (DivideByZeroException ex)
{
Console.WriteLine("ゼロで除算することはできません。");
}
catch (IndexOutOfRangeException ex)
{
Console.WriteLine("配列の範囲外にアクセスしようとしました。");
}
catch (Exception ex)
{
Console.WriteLine("未知のエラーが発生しました。");
Console.WriteLine($"エラーの詳細: {ex.Message}");
}
finallyブロックの使用
finallyブロックは、例外が発生したかどうかに関係なく、必ず実行されるコードを含む部分です。リソースの解放など、常に実行したい処理を記述します。
try
{
// 例外が発生する可能性のあるコード
}
catch (Exception ex)
{
// 例外を処理するコード
}
finally
{
// 例外の有無にかかわらず実行されるコード
Console.WriteLine("処理が終了しました。");
}
特定の例外を再スローする
特定の例外を処理した後、再度スローすることも可能です。
try
{
// 例外が発生する可能性のあるコード
}
catch (Exception ex)
{
Console.WriteLine("例外をキャッチしましたが、再スローします。");
throw; // 例外を再スロー
}
例外処理の応用
ユーザー定義の例外
C#では、独自の例外クラスを定義して、特定の状況に応じたエラーを扱うことができます。
public class CustomException : Exception
{
public CustomException(string message) : base(message) { }
}
// 使用例
try
{
throw new CustomException("これはカスタム例外です。");
}
catch (CustomException ex)
{
Console.WriteLine($"カスタム例外が発生しました: {ex.Message}");
}
リソースの管理
リソースを使用するコードでは、例外が発生してもリソースが正しく解放されるようにすることが重要です。using文を使用すると、IDisposableインターフェースを実装するオブジェクトが自動的に解放されます。
using (StreamReader reader = new StreamReader("file.txt"))
{
string content = reader.ReadToEnd();
Console.WriteLine(content);
}
この例では、ファイルが正しく閉じられることが保証されます。
まとめ
例外処理は、C#プログラミングにおいて重要なスキルです。try-catch文を使用することで、プログラムが予期しない状況でも安全に動作し続けることができます。この記事では、例外の基本から、複数の例外のキャッチ、finallyブロック、ユーザー定義の例外、リソース管理まで幅広く解説しました。これらの技術を理解し、適切に使用することで、より堅牢で信頼性の高いプログラムを作成することができるでしょう。

