独自の例外を定義して例外を発生させる

独自の例外を発生させるコードを紹介します。

概要

独自の例外を発生させる処理は以下の2つに分けられます。
  1. 独自の例外の定義
  2. 指定した例外の発生
以下それぞれの処理を紹介します。

独自の例外の定義

C#ではすべての例外は System.Exception クラスの派生クラスとして定義されています。独自の例外を定義する場合は、System.Exception クラスを継承したクラスを定義することで例外を定義できます。

指定した例外の発生

例外を発生させる場合は、throw コマンドを用います。throw の利用の詳細はこちらの記事を参照してください。

プログラム例

独自の例外を定義し発生させるコードを紹介します。

UI

Windows Formアプリケーションを作成し、下図のUIを作成します。フォームにボタンを1つ配置します。

コード

下記のコードを記述します。
こちらが独自の例外を定義する MyExceptionクラスです。
MyException.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ThrowException
{
  [Serializable()]
  public class MyException : System.Exception
  {
    public MyException() : base() { }
    public MyException(string message) : base(message) { }
    public MyException(string message, System.Exception inner) : base(message, inner) { }

    protected MyException(System.Runtime.Serialization.SerializationInfo info, 
      System.Runtime.Serialization.StreamingContext context)
    {
    }
  }
}

アプリケーションのフォームクラスです。button1のClickイベントを実装します。
FormSimpleThrowUniqueException.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ThrowException
{
  public partial class FormSimpleThrowUniqueException : Form
  {
    public FormSimpleThrowUniqueException()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      throw new MyException();
    }
  }
}

解説

MyException.cs の下記コードのクラス宣言により、System.Exception クラスから派生した MyException クラスを定義しています。このクラスが独自の例外クラスとなります。
  [Serializable()]
  public class MyException : System.Exception
  {
    ...
  }

フォーム側では、throw を利用して例外を投げます。 例外は、MyException クラスのインスタンスとします。
  private void button1_Click(object sender, EventArgs e)
  {
    throw new MyException();
  }

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。MyException例外が発生しプログラムが一時停止したことが確認できます。

独自の例外をキャッチする

UI

Windows Formアプリケーションを作成し、下図のUIを作成します。フォームにボタン1つとテキストボックス1つを配置します。

コード

下記のコードを記述します。
MyException.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ThrowException
{
  [Serializable()]
  public class MyException : System.Exception
  {
    public MyException() : base() { }
    public MyException(string message) : base(message) { }
    public MyException(string message, System.Exception inner) : base(message, inner) { }

    protected MyException(System.Runtime.Serialization.SerializationInfo info, 
      System.Runtime.Serialization.StreamingContext context)
    {
    }
  }
}
FormSimpleThrowUniqueException.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace ThrowException
{
  public partial class FormSimpleCatchUniqueException : Form
  {
    public FormSimpleCatchUniqueException()
    {
      InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
      try {
        throw new MyException("エラー:002");
      }
      catch (MyException exc) {
        textBox1.Text += "MyException例外を検出:" + exc.Message; 
      }
      finally {
      }

    }
  }
}

解説

MyException.cs のコードに関しては先のコード例と同様の独自例外の定義となります。
フォーム側では、MyException クラスのインスタンスを作成し、throw により例外を発生させます。MyExceptionクラスのコンストラクタの第一引数にエラーメッセージの文字列を与えています。
throw のコード部分をtry ブロック内に記述することで、throwで発生した例外をキャッチできます。MyException 例外が発生しますので、Catch部分も"MyException" 例外をキャッチする動作とします。例外がキャッチできた場合は、テキストボックスに "MyException"例外を検出した旨のメッセージを表示します。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


[button1]をクリックします。MyException例外が発生しますが、例外がキャッチされたためデバッガの実行停止にはなりません。テキストボックスに例外が発生した旨のメッセージが表示されます、メッセージはコード内の MyExceptionクラスのオブジェクト生成時に与えたメッセージが表示されていることも確認できます。


このページのキーワード
  • C# 独自 例外 作成
  • C# 独自 例外 発生
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2017-07-21
iPentec all rights reserverd.