PR

[C# 入門] 例外処理(try – catch)でプログラムがエラーで停止しないようにする

C#のプログラム実行中にエラーが発生するとそこで処理が中断されプログラムが終了してしまいます。

using System;
class Program
{
    public static void Main()
    {
        int[] ary = new int[] { 1, 2, 3 };
        // インデックスの範囲外にアクセス
        Console.WriteLine(ary[10]);

        Console.WriteLine("↑でエラーになりここは実行されない");
    }
}

try – catch 構文を使うとエラーが発生した際に、エラー用の例外処理までスキップしてプログラムを終了しないようにすることができます。

ここでのエラーは想定外の処理や値のことで、例外は想定内のエラーという意味です。
想定内のエラーが起こった時に行う処理が例外処理です。

スポンサーリンク

try – catch 構文の使い方

構文はこんな感じです。

try {
    // エラーが発生する可能性のある処理
}
catch(例外クラス 変数名) {
    // エラーが発生時に実行する処理(例外処理)
    // catchブロック内でエラーが発生しないよう注意が必要
}

tryブロック { } の中にエラーが発生する可能性のある処理を書きます。
catchブロック { } の中にはエラー発生時の例外処理を書きます。エラーが発生しなかった場合はcatchブロック内の処理を実行されません。

catchブロック内でエラーが発生した場合、プログラムが終了してしまうので、catchブロック内にエラーが発生する可能性のあるコードを書くときは注意が必要です。

例外クラスには、System.Exceptionから派生した想定するエラーのクラスを指定します。とりあえずSystem.Exceptionを指定するといろんなエラーに対応できます。
エラーの種類ごとに例外処理を分ける場合はそれぞれの想定する例外クラスにします。

変数名で指定した変数に例外情報が入ります。

最初のエラーが発生するコードをtry – catch を使って書き直してみます。

using System;
class Program
{
    public static void Main()
    {
        try
        {
            int[] ary = new int[] { 1, 2, 3 };
            // インデックスの範囲外にアクセス
            Console.WriteLine(ary[10]);

            Console.WriteLine("↑でエラーになりここは実行されない");
        }
        catch (Exception ex) {
            // exにエラー情報が入る
            Console.WriteLine(ex);
        }
    }
}

出力結果はこんな感じです。

System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at Program.Main() in d:\source\repos\test\Program.cs:line 10

10行目でエラーが発生してcatchブロックまで処理がスキップされます。
そしてcatchブロック内の処理が実行され try – catch を抜けます。

エラーがあっても12行目のメッセージを出力したいという場合は、
try – catchの外側にコードを書きます。

外側に書く場合はこんな感じです。

using System;
class Program
{
    public static void Main()
    {
        try
        {
            int[] ary = new int[] { 1, 2, 3 };
            // インデックスの範囲外にアクセス
            Console.WriteLine(ary[10]);
        }
        catch (Exception ex)
        {
            // exにエラー情報が入る
            Console.WriteLine(ex);
        }
        // try-catchの外側に書く
        Console.WriteLine("↑でエラーになってもここなら実行される!");
    }
}
スポンサーリンク

例外ごとに処理を分ける

catchブロックは例外ごとに複数指定することができます。

using System;
class Program
{
    public static void Main()
    {
        try
        {
            int[] ary = new int[] { 1, 2, 3 };
            // インデックスの範囲外にアクセス
            Console.WriteLine(ary[10]);
        }
        catch (IndexOutOfRangeException indexEx) {
            // インデックス範囲外の場合の例外処理
            Console.WriteLine("IndexOutOfRangeExceptionが発生!!!");
            Console.WriteLine(indexEx);
        }
        catch (Exception ex)
        {
            // その他のエラーの場合の例外処理
            Console.WriteLine("その他のエラーが発生!!!");
            Console.WriteLine(ex);
        }
    }
}
IndexOutOfRangeExceptionが発生!!!
System.IndexOutOfRangeException: Index was outside the bounds of the array.
   at Program.Main() in d:\source\repos\test\Program.cs:line 10
スポンサーリンク

一般的な例外

catchに指定できる例外(Exception)の一覧です。

例外説明名前空間
IndexOutOfRangeException配列のインデックス指定が間違っている場合に発生System
NullReferenceExceptionnullが入っている変数が参照された場合に発生System
FileNotFoundExceptionファイルが存在しない場合に発生System.IO
DivideByZeroException0で除算が行われた場合に発生System
FormatExceptionparseメソッドなどで変換を行う際に適切な形式ではなかった場合に発生System
KeyNotFoundExceptionコレクション内のメンバーにアクセスするためのキーが見つからない場合に発生System.Collections.Generic

長くなってきたので次へ続きます、次は例外を自分で発生させる方法です。
[C# 入門] 自分で例外を発生させる(throw)


C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント