例外はエラーの発生を伝える手段です。
システム側で定義されたいくつかの例外があります。0で割ったとか、ファイルが見つからない等です。しかし、いずれの条件にも当てはまらないエラーを自作ソースから発生させたいことがあります。
そういう時は例外を自作できます。
サンプルソースのMyExceptionクラスがその実例です。
Exceptionクラスを継承すればそれも例外クラスになります。
自作のクラスでもちゃんとthrow文で例外を発生できるし、try-catch構文でキャッチできます。
自作例外の書き方はサンプルソースの通りです。このようなものだと思って下さい。
名前を差し替えてこのまま使うこともできます。
名前の最後はExceptionにしておいて下さい。
実際に作ってみるとそれほど難しくはありません。
罠の数々 §
- エラーが起きたときに例外を起こすことは必須ではない。たとえば、int.TryParseメソッドのように、変換でなかったことを戻り値で伝えるメソッドもある。例外以外の方法は取れないか検討しておこう
- 自作例外クラスは実は不要であることも多い。区別する必要のない例外はまとめて一つの例外クラスで処理しても良い。たとえば、使えるメッセージだけが違う例外は区別する必要のない例外である
参考リンク §
ユーザー定義の例外を作成する方法
実はこのサンプルソースの自作例外は十分ではない。このサンプルソースでは上手く動作しているが、実装内容や利用環境によって動作しないことがある。何が足りないのだろうか。上記のリンクから辿って足りないものの正体を確認しておこう。
リポジトリ §
https://github.com/autumn009/cshowto
MyException §
using System;
class MyException : Exception
{
public MyException()
{
}
public MyException(string message)
: base(message)
{
}
public MyException(string message, Exception inner)
: base(message, inner)
{
}
}
class Program
{
private static void sub(uint n)
{
if (n >= 1000) throw new MyException("sub メソッドが扱えるのは999までです。");
Console.WriteLine($"[{n,3}]");
}
static void Main()
{
try
{
sub(9);
sub(99);
sub(999);
sub(9999);
}
catch (MyException e)
{
Console.WriteLine(e.Message);
}
}
}
実行結果
[ 9]
[ 99]
[999]
sub メソッドが扱えるのは999までです。