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# クラスの継承の仕組みとサンプル

△上に戻る