【C#入門】throwで例外の作成や再スローする方法(try-catch)

こんにちは!エンジニアの中沢です。

C#には例外をスローするための「throw」があります。「throw」を使えば例外を作成したり、例外を再スローすることができるので、ぜひ活用してください。

この記事では、

  • try catchとは
  • try-catchの使い方

という基本的な内容から、

  • throwとは
  • throwで例外を発生させる方法
  • throwで例外を再スローする方法

などの応用的な使い方に関しても解説していきます。今回はこれらの方法を覚えるために、例外をスローするさまざまな使い方をわかりやすく解説します!

目次

try-catchとは

try-catchとは、例外が発生する可能性がある処理に使うものです。try-catchを使うことで、例外が発生しない場合の処理と、例外が発生したときの処理を分けることができます。

try-catchは次のように記述します。

try {
    例外が発生する可能性のある処理
} catch (例外の型 引数) {
    例外が発生した場合の処理(例外が発生しなければ行われない処理)

try catchの使い方

ここでは、try-catchの使い方を解説します。try-catchは、tryブロックの中に例外が発生する可能性のある処理を記述し、catchブロックの中に例外が発生した後の処理を記述します。

try-catchの使い方を次のプログラムで確認してみましょう。

using System;

namespace Sample
{
    class Sample
    {
        static int DivSample(int num1, int num2)
        {
            try
            {
                int result = num1 / num2;

                return result;
            }
            catch (ArithmeticException e)
            {
                Console.WriteLine("例外が発生しました。");
                Console.WriteLine(e);

                return 0;
            }

        }

        static void Main()
        {
            int result;
            result = DivSample(5, 0);

            Console.WriteLine("戻り値 = " + result);

            Console.ReadKey();
        }
    }
}

実行結果:

例外が発生しました。
System.DivideByZeroException: 0 で除算しようとしました。
戻り値 = 0

このプログラムでは、DivSampleメソッドで割り算を行い、その結果を呼び出し元のmainメソッドに返しています。

0で割り算を行っているので、DivideByZeroExceptionの例外をスローして、catchブロックの中の処理が行われていることがプログラムの実行結果から確認できます。その後、呼び出し元のmainメソッドの処理が行われています。

throwとは

throwを使えば、例外を作成して任意のタイミングでスローすることができます。また、キャッチした例外を呼び出し元のメソッドに再スローすることもできます。

throwで例外を発生させる方法

ここでは、throwで例外を発生させる方法を解説します。throwを使えば、例外の種類を指定して、任意のタイミングで例外を発生させることができます。

次のプログラムで確認してみましょう。

using System;

namespace Sample
{
    class Sample
    {
        static int DivSample(int num1, int num2)
        {
            if (num2 != 0)
            {
                int result = num1 / num2;
                return result;
            }
            else
            {
                throw new DivideByZeroException();
            }
        }

        static void Main()
        {
            try
            {
                int result = DivSample(5, 0);
                Console.WriteLine(result);
            }
            catch (Exception e)
            {
                Console.WriteLine("例外をキャッチしました");
                Console.WriteLine(e);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

例外をキャッチしました
System.DivideByZeroException: 0 で除算しようとしました。

このようにして、例外を発生させることができました。

throwで例外を再スローする方法

ここでは、throwで例外を再スローする方法を解説します。catchブロックの中でthrowを使うと、呼び出し元のメソッドへ例外を再スローすることができます。

次のプログラムで確認してみましょう。

using System;

namespace Sample
{
    class Sample
    {
        static int DivSample(int num1, int num2)
        {
            return num1 / num2;
        }

        static int ThrowSample(int num1, int num2)
        {
            try
            {
                return DivSample(num1, num2);
            }
            catch (Exception e)
            {
                throw;
            }
        }

        static void Main()
        {
            try
            {
                DivSample(5, 0);
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            Console.ReadKey();
        }
    }
}

実行結果:

System.DivideByZeroException: 0 で除算しようとしました。

このようにして、例外を再スローすることができました。

まとめ

いかがでしたか?今回はthrowで例外処理をする方法を解説しました。throwを使えば任意のタイミングで例外を発生させたり、例外を再スローすることができるので、ぜひ活用してくださいね。もし、例外をthrowする方法を忘れてしまったらこの記事を確認してください!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次