C#

C# | try-catchの基本と応用:初心者でも分かる例外処理

2024年5月31日

本ページはプロモーションが含まれています

C#trycatch_アイキャッチ画像

C#のtry-catch文は、例外処理を行うためのものです。

try
{
    // 例外が発生する可能性のあるコードを記述するブロック
}
catch (ExceptionType1 ex)
{
    // ExceptionType1型の例外が発生した場合の処理
}
catch (ExceptionType2 ex)
{
    // ExceptionType2型の例外が発生した場合の処理
}
finally
{
    // 必要に応じて、tryブロックの後に実行する最終処理を記述するブロック
}

エラー処理に関して考える疑問や問題点は以下のようなものがあります。

  1. 例外処理の種類:例外処理の種類が知りたい。
  2. エラーの発生理由と解決方法:エラーが発生した原因と、エラーメッセージや例外情報がわかりにくい。
  3. その他の例外処理の方法:try-catch文や例外処理の他に、どのような方法でエラーを処理すればいいのか。

この記事ではこれらについても詳しく解説します。

例外処理のメリット

プログラムを実行しているときに予期しないエラーが発生することは避けられません。

例えば、ユーザーが無効な入力を行ったり、ネットワーク接続が突然切れたり、ファイルが存在しなかったりする場合があります。

これらのエラーを適切に処理しないと、プログラムはクラッシュしてしまい、ユーザーに不便を強いるだけでなく、データが失われたり、システムが不安定になったりする可能性があります。

適切な例外処理を行うことは、以下のような多くの利点があります。

  1. ユーザー体験の向上
    • エラーが発生した場合でも、適切なメッセージを表示してユーザーに安心感を与えることができます。
    • プログラムを正常に終了させることで、ユーザーが操作を続けられるようにすることができます。
  2. データの保護
    • エラー発生時にデータが破損しないように適切に処理を行うことで、データの整合性を保つことができます。
  3. プログラムの安定性向上
    • エラーを適切に処理することで、プログラムが予期しないクラッシュを避け、システムの安定性を維持できます。
  4. デバッグとトラブルシューティングの容易化
    • エラー発生時に詳細な情報をログに記録することで、問題の原因を迅速に特定し、修正することができます。

try-catchの基本文法

try
{
    // 例外が発生する可能性のあるコード
}
catch (ExceptionType ex)
{
    // 例外が発生した場合の処理
}
finally
{
    // 必ず実行されるコード
}

構成要素

  • tryブロック
    • 例外が発生する可能性のあるコードを囲むブロックです。
    • ここに記述したコードが実行され、例外が発生した場合はcatchブロックに制御が移ります。
  • catchブロックcatch (ExceptionType ex)
    • tryブロック内で例外が発生した場合に実行されるコードを記述します。
    • 例外の種類に応じて複数のcatchブロックを設置することができます。各catchブロックでは特定の例外型を指定できます。
    • ExceptionType:例外クラスというもので、さまざまなエラーに対応しています。エラーの種類については次項に記載します。
    • ex:「ex」は例外をキャッチするための変数名であり、例外が発生した際にその例外をこの変数に格納します。この変数名は任意のものであるため、開発者が任意な名前を選択することができますが、一般的には「ex」という短縮形がよく使われます。
  • finallyブロック(オプション)
    • tryブロックの後に必ず実行されるコードを記述します。例外が発生したかどうかに関係なく実行されます。
    • リソースの解放など、常に実行する必要がある処理に使用します。
    • 必ず必要なブロックではないです。省略可です。

Catchブロックの引数と例外クラス一覧

主な例外クラスを一覧表にしました。

例外クラスカテゴリ説明
Exception ex一般的な例外すべての例外の基本クラス。
SystemException ex一般的な例外システムレベルのエラーを示す基本クラス。
ArgumentException ex具体的な例外メソッドに渡される引数が無効な場合にスローされる。
ArgumentNullException ex具体的な例外メソッドに渡される引数がnullの場合にスローされる。
ArgumentOutOfRangeException ex具体的な例外メソッドに渡される引数が許容範囲外の場合にスローされる。
ArithmeticException ex具体的な例外数値演算中にエラーが発生した場合にスローされる。
DivideByZeroException ex具体的な例外0で除算した場合にスローされる。
OverflowException ex具体的な例外算術演算がオーバーフローした場合にスローされる。
ArrayTypeMismatchException ex具体的な例外配列の型が一致しない場合にスローされる。
FormatException ex具体的な例外文字列の形式が無効な場合にスローされる。
IndexOutOfRangeException ex具体的な例外配列のインデックスが範囲外の場合にスローされる。
InvalidCastException ex具体的な例外無効なキャストが行われた場合にスローされる。
InvalidOperationException ex具体的な例外オブジェクトの現在の状態で無効な操作が行われた場合にスローされる。
NullReferenceException ex具体的な例外オブジェクト参照がnullの場合にスローされる。
OutOfMemoryException ex具体的な例外メモリ不足の場合にスローされる。
StackOverflowException ex具体的な例外スタックオーバーフローが発生した場合にスローされる。
TypeInitializationException ex具体的な例外型の初期化子が例外をスローした場合にスローされる。
IOException ex入出力関連の例外入出力エラーが発生した場合にスローされる。
DirectoryNotFoundException ex入出力関連の例外指定されたディレクトリが見つからない場合にスローされる。
EndOfStreamException ex入出力関連の例外ストリームの終わりに達した場合にスローされる。
FileLoadException ex入出力関連の例外ファイルの読み込みに失敗した場合にスローされる。
FileNotFoundException ex入出力関連の例外指定されたファイルが見つからない場合にスローされる。
PathTooLongException ex入出力関連の例外パスがシステムで定義された最大長を超えた場合にスローされる。
WebException exネットワーク関連の例外ネットワークアクセス中にエラーが発生した場合にスローされる。
SocketException exネットワーク関連の例外ソケット操作中にエラーが発生した場合にスローされる。
SecurityException exセキュリティ関連の例外セキュリティ違反が発生した場合にスローされる。
UnauthorizedAccessException exセキュリティ関連の例外アクセスが拒否された場合にスローされる。
ThreadAbortException exスレッド関連の例外スレッドの中止要求が行われた場合にスローされる。
ThreadInterruptedException exスレッド関連の例外実行中のスレッドが中断された場合にスローされる。
ThreadStateException exスレッド関連の例外無効なスレッド状態で操作が試みられた場合にスローされる。
TaskCanceledException exタスク関連の例外タスクがキャンセルされた場合にスローされる。
TimeoutException exタスク関連の例外操作がタイムアウトした場合にスローされる。

エラーの発生理由と解決方法

  • 文法エラー
    • 原因:コードが正しいC#の文法に従っていない場合に発生します。例えば、セミコロンの不足や不適切な括弧の使用などが該当します。
    • 解決方法: エラーメッセージで指摘された行と列を確認し、正しいC#の文法に修正します。例えば、セミコロンの追加、括弧の整合性の修正などを行います。
  • 型エラー
    • 原因:データ型の不一致や、適切でない型の操作を行った場合に発生します。例えば、整数型の変数に文字列を代入しようとした場合などです。
    • 解決方法: エラーメッセージを確認し、どの部分で型の不一致が起きているかを特定します。必要に応じて、変数の型を適切なものに変更するか、型変換(キャスト)を行います。
  • 実行時エラー
    • 原因:プログラムが実行中に発生するエラーで、主に例外として現れます。例外は、予期しない条件や処理不可の状況で発生します。
    • 解決方法: 実行時エラーは例外として発生することが多いため、try-catch ブロックを使用して例外をキャッチし、適切に処理します。具体的なエラーメッセージを読み、原因を特定して対応します。
  • リソース不足や環境依存のエラー
    • 原因:ファイルが見つからない、ネットワーク接続が失敗する、データベースへのアクセスに失敗するなど、外部のリソースや環境に依存するエラーです。
    • 解決方法: 外部リソースへのアクセスが失敗する場合は、ネットワーク接続の確認やファイルの存在を確認します。必要に応じてエラー処理を追加し、適切なエラーメッセージを表示します。
  • ロジックエラー
    • 原因:プログラムが予期しない結果を返す場合に発生します。コードのロジックが誤っている場合に起こります。
    • 解決方法: ロジックエラーはプログラムの設計上の問題であり、コードのロジックを再検討し修正します。デバッグツールを使用して、期待される動作と実際の動作を比較し、問題の原因を特定します。

その他の例外処理の方法

try-catch文を使用せず、戻り値によるエラーコードの使用した例外処理の方法を紹介します。

以下の例はメソッドの戻り値を使ってエラーの種類や状態を示す方法です。
これはメソッドが成功したか失敗したかを示す整数値や列挙型でエラーコードを返す方法です。

using System;
using System.IO;

public class Program
{
    public int ReadFile(string filePath)
    {
        if (!File.Exists(filePath))
        {
            return -1; // ファイルが存在しない
        }

        string content = File.ReadAllText(filePath);
        Console.WriteLine("ファイルの内容:");
        Console.WriteLine(content);
        return 0; // 成功
    }

    public static void Main()
    {
        var program = new Program();
        string filePath = "example.txt";

        int result = program.ReadFile(filePath);

        if (result == -1)
        {
            Console.WriteLine("ファイルの読み込みに失敗しました。");
        }
        else
        {
            Console.WriteLine("ファイルの読み込みに成功しました。");
        }
    }
}

まとめ

  • try ブロックは、例外が発生する可能性のあるコードを囲みます。
  • catch ブロックは、try ブロック内で発生した例外をキャッチし、適切な処理を行います。
  • catch ブロックは、try ブロック内で指定された例外型に一致する例外をキャッチします。
  • 複数の catch ブロックを使用して、異なる例外型に対する異なる処理を記述することができます。
  • 最後に、オプションで finally ブロックを使用して、例外の有無に関係なく実行されるクリーンアップ処理を記述することができます。
  • try-catch ブロックは、プログラムの安全性と信頼性を向上させるために使用されます。例外が発生しても、プログラムが予期せぬ終了をせずに適切に処理されるようにします。

Follow me!

-C#
-,

PAGE TOP