C_Sharp-例外処理

例外処理について

例外(exception)と例外処理について

例外とは、プログラムの実行の継続を妨げる異常な事象(エラー)のことです。

例外が発生した場合に、現在の処理を中断して別の処理を行うことを例外処理といいます。


例外の捕捉

C#では、「try-catch-finally」で例外を捕捉します。


class FileData
{
    public string[] lines;

    // コンストラクタ
    public FileData(string filename)
    {
        // ファイルを読み込み配列に格納する
        this.lines = System.IO.File.ReadAllLines(filename);
    }

    // ファイル内容を出力する
    public void show()
    {
        foreach(string line in lines){
            System.Console.WriteLine(line);
        }
    }
}

class Program
{
    static int Main(string[] args)
    {
        try{
            // 例外の発生を監視するブロック
            System.Console.WriteLine("[try]");
            FileData fd = new FileData(args[0]);
            fd.show();
        }catch(System.Exception ex){
            // 発生した例外に対する処理ブロック
            System.Console.WriteLine("[catch]");
            System.Console.WriteLine(ex); // エラー内容を出力
        }finally{
            //例外発生の有無にかかわらず実行したい処理ブロック
            System.Console.WriteLine("[finally]");
        }
        return(0);
    }
}

例外の発生

例外を意図的に発生させるには、tryブロック内で「throw」を実行します。


throw 例外クラスのインスタンス

tryブロック内で関数呼び出しがある場合、その内部関数もtryブロック内であると見なされます。


class ErrInfo
{
    public void error_occur()
    {
        System.Console.WriteLine("Let's throw!");
        throw new System.Exception("Exception test");
    }
}

class Program
{
    static int Main(string[] args)
    {
        try{
            // 例外の発生を監視するブロック
            ErrInfo err_obj = new ErrInfo();
            err_obj.error_occur();
        }catch(System.Exception ex){
            // 発生した例外に対する処理ブロック
            System.Console.WriteLine(ex); // エラー内容を出力
        }finally{
            //例外発生の有無にかかわらず実行したい処理ブロック
        }
        return(0);
    }
}

標準で用意されている例外クラス

.NET Frameowrk が標準で提供する例外クラスで利用頻度の高いものを記載します。


System名前空間

ArgumentNullException 引数がnullである。
ArgumentException メソッドの引数が不正である場合。
ArrayTypeMismatchException 不正な型の要素を配列に格納しようとした場合。
OverflowException 算術演算やキャストでオーバーフローが起きた場合。
NotImplementedException メソッドが未実装の場合。
NullReferenceException nullオブジェクト参照を逆参照しようとした場合。ぬるぽ。
DivideByZeroException 0での除算。

System.IO名前空間

DirectoryNotFoundException ディレクトリが存在しない場合。
FileNotFoundException ファイルが存在しない場合。
EndOfStreamException ストリームの末尾を超えて読み込もうとしている場合。

System.Collections.Generic名前空間

KeyNotFoundException コレクションに該当するキーが存在しない場合。


関連ページ