独自の例外を定義して例外を発生させる
独自の例外を発生させるコードを紹介します。
概要
独自の例外を発生させる処理は以下の2つに分けられます。
- 独自の例外の定義
- 指定した例外の発生
以下それぞれの処理を紹介します。
独自の例外の定義
C#ではすべての例外は System.Exception クラスの派生クラスとして定義されています。独自の例外を定義する場合は、System.Exception クラスを継承したクラスを定義することで例外を定義できます。
指定した例外の発生
例外を発生させる場合は、throw コマンドを用います。throw の利用の詳細は
こちらの記事を参照してください。
プログラム例
独自の例外を定義し発生させるコードを紹介します。
UI
Windows Formアプリケーションを作成し、下図のUIを作成します。フォームにボタンを1つ配置します。
コード
下記のコードを記述します。
こちらが独自の例外を定義する MyExceptionクラスです。
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イベントを実装します。
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つを配置します。
コード
下記のコードを記述します。
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)
{
}
}
}
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クラスのオブジェクト生成時に与えたメッセージが表示されていることも確認できます。
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用