2008年1月18日金曜日

C#でのユーザー定義Exception(例外)の作り方

「プログラムにエラーはつきもの」

と言うのは、言い過ぎかも知れませんが、
エラーが起こる可能性を0(ゼロ)にすることはなかなか難しい。

エラーが発生した場合、そのエラーがなぜ発生したのかがわかると、
対処がしやすいものです。

そのため、何のエラーかを識別するために、.NET Frameworkには多くのExceptionが存在します。

しかし、これらのExceptionだけでは足らず(適切なものがなく)、
自ら定義をして例外の種類を追加したいことがあります。

このような場合、ユーザー自身がExceptionを定義することで、
より細かくエラーを識別する手助けをすることができます。


今回は例外を試すだけなので、コンソールアプリケーションで行いましょう。
("ファイル" > "新しいプロジェクト" > "コンソール アプリケーション")

例外のためのクラスを追加します。

例外を作成する場合は、クラスの最後に"Exception"と付けると、
コーディング時に便利です。

クラス名は"OriginalException"としておきましょう。

/*** OriginalException.cs ***/
public class OriginalException : Exception
{
public OriginalException() { }

public OriginalException(string message) : base(message) { }

public OriginalException(string message, Exception inner) : base(message) { }
}

このように、例外を作成する場合は必ず"Exception"クラスを継承しなくてはなりません。

また、推奨される3つのコンストラクタは実装しておくと便利です。

2つ目と3つ目のコンストラクタには、コンストラクタ宣言の後に

: base(...)
が付いています。

これは継承元クラス(baseクラス,この場合"Exception"クラス)のコンストラクタを
呼び出すことを意味しています。
通常、クラスに継承関係がある場合、継承元のコンストラクタが実行された後、
継承先のコンストラクタが実行されます。
しかし、その場合、コンストラクタの引数は継承先のコンストラクタに渡され、
継承元のコンストラクタには渡されません。
そこで、": base"を用いることで、継承元のコンストラクタへ引数を渡すことができます。

実際に作成した"OriginalException"を試してみます。

/*** Program.cs ***/
private static void ThrowTest()
{
Console.WriteLine("Enter ThrowTest method.");
throw new OriginalException("This is an OriginalException.");
Console.WriteLine("Exit ThrowTest method.");
}

[STAThread]
public static void Main()
{
ThrowTest();
}

実行しようとすると、以下のように警告されます。

到達できないコードが検出されました。

これは、例外を投げると、それ以降のコードが処理されず、
"ThrowTest"メソッドの3行目が実行されないことを意味しています。

警告を無視して実行します。


コンソールに「Enter ThrowTest method.」と表示された後、


とエラーが表示されました。

次に、Mainメソッドを変更して、例外処理を行います。

/*** Program.cs ***/
public static void Main()
{
try
{
ThrowTest();
}
catch (OriginalException e)
{
Console.WriteLine("Exception occured : " + e.Message);
}
finally
{
Thread.Sleep(5000);
}
}

実行します。
("using System.Threading;"を追加して、名前空間の修飾省略定義を
 行って下さい。)


正しく例外をキャッチすることができました。


.Net Frameworkでもユーザー独自の例外を作成することができます。

ユーザー独自の例外を用いることで、よい効率的なコーディングができるように
なります。


参照:
MSDN : 方法:ユーザー定義の例外を作成する

0 件のコメント: