PR

[C# 入門] 自分で例外を発生させる(throw)

try-catch構文の説明の続きです。
try-catchについてはこちらの記事を見てください。

[C# 入門] 例外処理(try - catch)でプログラムがエラーで停止しないようにする
C#のプログラム実行中にエラーが発生するとそこで処理が中断されプログラムが終了してしまいます。 using System; class Program { public static void Main() { int[] ary = ne...
スポンサーリンク

例外を発生させる(throw)

throwキーワードを使うと自分で例外を発生させることが出来ます。
自分でメソッドを作るときに想定外の値が渡された時などに使います。

throw new Exception("エラーのメッセージ");

throwで例外を発生させる場合、メソッドを呼び出す側でtry-catchを使いその例外を処理する必要があります。そうしないとプログラムが終了してしまいます。

using System;
class Program
{
    public static void Main()
    {
        try
        {
            // メソッドに想定外の値を渡す
            CheckRange(100);

            Console.WriteLine("↑でエラーになりここは実行されない");
        }
        catch (Exception ex)
        {
            // エラーの場合の例外処理
            Console.WriteLine("Mainメソッドでエラーが発生!!!");
            Console.WriteLine(ex);
        }
    }

    public static void CheckRange(int value)
    {
        // 引数のチェック
        if (!(value >= 0 && value <= 10))
        {
            throw new Exception("CheckRangeの引数は0~10の間で指定してください。");
        }
    }
}
Mainメソッドでエラーが発生!!!
System.Exception: 引数は0~10の間で指定してください。
   at Program.CheckRange(Int32 value) in d:\source\repos\test\Program.cs:line 24
   at Program.Main() in d:\source\repos\test\Program.cs:line 9
スポンサーリンク

メソッド内で発生した例外を再発生させる(throw)

catchブロック内でthrowキーワードを使うと例外を再発生させることができます。
これを使うとメソッド内で発生した例外を処理した後で呼び出し元にもその例外を伝えることができます。

using System;
class Program
{
    public static void Main()
    {
        try
        {
            TestMeshod();
        }
        catch (Exception ex)
        {
            // エラーの場合の例外処理
            Console.WriteLine("Mainメソッドでエラーが発生!!!");
        }
    }

    public static void TestMeshod() {
        try
        {
            // インデックスの範囲外にアクセス
            Console.WriteLine(new int[] { 1, 2, 3 }[10]);
        }
        catch (IndexOutOfRangeException indexEx)
        {
            // インデックス範囲外の場合の例外処理
            Console.WriteLine("TestMeshodでIndexOutOfRangeExceptionが発生!!!");
            // 例外を再発生させる
            throw;
        }
    }
}

出力結果はこんな感じです。

TestMeshodでIndexOutOfRangeExceptionが発生!!!
Mainメソッドでエラーが発生!!!
スポンサーリンク

throw式

次の場合、式でthrowが使えます。

式形式のラムダ

=> の右辺でthrowが使えます。
こんな感じで、まだこのメソッドを実装してないよという例外をスローするのに使います。

// まだ未実装
void Method() => throw new NotImplementedException();

ちなみにかぎかっこ { } を使わずに右辺に式1つなのが「式形式のラムダ
() => 式;
かぎかっこ { } の中に処理を書くのが「ステートメント形式のラムダ」というらしい。
() => { ステートメント; }
ステートメント形式のラムダではthrowは使えないので注意。

Null合体演算子

??」がNull合体演算子です。左辺がnullなら右辺を返すという動きをします。
で、右辺にthrowが使えます。これで、ある変数がnullだったら例外を発生させることができます。

object obj = null;
string str = obj as string ?? throw new Exception("Nullはダメ");

三項演算子

三項演算子の戻り値を返す部分2か所どちらかにthrowが使えます。

int x = 10;
int y = (x >= 0) ? x : throw new Exception();
int z = (x == 5) ? throw new Exception() : x;

switch式

switch式の戻り値を返す部分にthrowが使えます。

int i = 10;
var message = i switch
{
    1 => "iが1はOK",
    2 => throw new ArgumentException("2はダメ"),
    3 => "iが3はOK",
    _ => throw new ArgumentException("1と3以外はだめ")
};

以上。


C# 記事まとめページに戻る(他のサンプルコードもこちら)

C# プログラミング講座
C#についての記事まとめページです。開発環境VisualStudioのインストール方法や使い方、プログラミングの基礎知識についてや用語説明の記事一覧になっています。講座の記事にはすぐに実行できるようにサンプルコードを載せています。

コメント