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 コレクションに該当するキーが存在しない場合。


関連ページ



スポンサード リンク