C# 例外処理のサンプル(try…catchとthrow)

C#の例外処理のサンプルです。
try...catch構文とthrow文と独自の例外の作成についてです。

目次

try...catch構文

try {
   実行する処理
} catch ( 例外のクラス 変数 ) {
   実行する処理
} finally{
 実行する処理
}

コード

try...catch構文のコードです。

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        int num1 = 1;
        int num2 = 0;

        try
        {
            Console.WriteLine(calc1(num1, num2));
        }
        catch (ArithmeticException ex)
        {
            Console.WriteLine(ex.Message); //0 で除算しようとしました。
        }
        finally
        {
            Console.WriteLine("終了"); //終了
        }
    }
    private static int calc1(int a,int b)
    {
        return a / b;
    }
}

11行目は、例外が起こる可能性がある関数をtryブロックで囲んでいます。
26行目は、0で割るためArithmeticExceptionの例外が発生します。
15行目は、例外をcatchしメッセージを表示します。「0 で除算しようとしました。」
19行目は、finallyブロックでメッセージが表示されます。「終了」

例外を再スローする

catch句でthrow;を記述すると、例外を上位のcatch句に渡します。再スローと呼ばれます。

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        int num1 = 1;
        int num2 = 0;

        try
        {
            Console.WriteLine(calc1(num1, num2));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message); //0 で除算しようとしました。
        }
        finally
        {
            Console.WriteLine("終了"); //終了
        }
    }
    private static int calc1(int a,int b)
    {
        int c = 0;
        try
        {
            c = a / b;
        }
        catch (ArithmeticException)
        {
            throw;
        }
        return c;
    }
}

29行目は、0で割るためArithmeticExceptionの例外が発生します。
33行目は、throwで例外を上位のcatchに渡しています。
※throwを記述しなかった場合、15行目でキャッチされません。
15行目で例外をキャッチし文言を出力します。

throw文

throw new 例外

コード

throw文のサンプルです。

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        int num1 = 1;

        try
        {
            Console.WriteLine(calc1(num1));
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message); //エラーです
        }
        finally
        {
            Console.WriteLine("終了"); //終了
        }
    }
    private static int calc1(int a)
    {
        if (a == 1){
            throw new Exception("エラーです");
        }
        return a;
    }
}

10行目からは、try-catch構文です。
26行目は、throw文で例外を発生させています。
14行目は、例外をcatchしメッセージを表示します。「エラーです」

独自の例外を作成する

独自の例外を作成するには、Exceptionクラスを継承します。

using System;
using System.Collections.Generic;

class Test1
{
    static void Main()
    {
        int num1 = 1;

        try
        {
            Console.WriteLine(calc1(num1));
        }
        catch (TestException ex)
        {
            Console.WriteLine(ex.Message); //独自の例外
        }
        finally
        {
            Console.WriteLine("終了"); //終了
        }
    }
    private static int calc1(int a)
    {
        if (a == 1)
        {
            throw new TestException("独自の例外");
        }
        return a;
    }
}
public class TestException : Exception
{
    public TestException(string name)
        :base(name){ }
}

32行目で、Exceptionクラスを継承して独自の例外を作成しています。
27行目は、独自のエラーをthrowしています。
35行目の:baseは、現在のインスタンスの基底クラスを参照します。
14行目でcatchされ「独自の例外」と表示されます。

関連の記事

C# コンストラクタのサンプル
C# クラスの継承の仕組みとサンプル

△上に戻る