前節で見たように、.NET Frameworkで用意されているメソッドで発生する可能性があるものは、MSDNライブラリーに説明が載せられているので、その例外クラス名を使用して例外処理を記述できます。例外処理はそれ以外にも、自分で例外クラスを作って、発生(スロー)させることもできます。
例外クラスを作成するには次のように記述します。
例外クラス定義の書式 |
---|
class 例外クラス名 : Exception { … } |
自分で作った例外クラスは自分でスローしなくてはなりません。例外をスローするには次のように記述します。
例外クラススローの書式 |
---|
throw 例外オブジェクト; |
ここで、先回作成したBusクラスを修正しましょう。今までは、乗車や降車をするときに走っていないかどうかなどを調べ、異常がある場合はその旨のメッセージを返すように作ってきました。それを例外処理に書き換えましょう。
○ プロジェクト
プロジェクトを作成して確認してみましょう。
プロジェクトの種類 | コンソール アプリケーション |
---|---|
プロジェクト名 | ThrowTest |
○ 作成の準備
「InheritanceTest」プロジェクトを修正して作成しましょう。InheritanceTestフォルダーをコピーして、作成するプロジェクト名にフォルダー名を変更してください。
○ プログラム
例外を表すクラスを作成しましょう。Exceptionクラスを継承した次のようなクラスを作成してください。
WarningException.cs
○ 解説
10行目でスーパークラスにExceptionクラスを指定しています。それにより今回作成したWarningExceptionクラスはスローしてキャッチすることができるようになります。例外を表すクラスは多くの場合~Exceptionのように名前を付けます。
12~15行目ではコンストラクタを定義しています。このコンストラクタはインスタンス生成時にスーパークラスであるExceptionクラスのコンストラクタを呼び出しています。引数として受け取ったエラーメッセージをさらに引数として渡しています。これによりMessageプロパティで引数で指定したエラーメッセージが参照できるようになります。
○ プログラム
次にBusクラスを変更しましょう。次のように修正してください。
Bus.cs
○ 解説
31、49行目では、処理の中でエラーが発生した場合は文字列を返す仕組みから例外をスローする仕組みに変更するため、戻すデータがなくなりました。そのため、戻り値の型をstringからvoidに変更しています。
36、41、54、59行目では、エラーが発生した場合にその時のエラーメッセージをreturn文で返していましたが、throw文を使って例外をスローさせるように変更しました。
○ プログラム
次にMainメソッドを変更しましょう。次のように修正してください。
Program.cs
○ 解説
30~77行目では、try~catch文が記述されています。56、61行目で、バスオブジェクトのメソッドが呼び出されると、状態によって例外(WarningException)がスローされてきます。その場合は、69行目でキャッチされ、71行目の処理が行われます。73行目はWarningException以外がtry文の中でスローされたときにキャッチされます。
catch文は複数指定することができます。try文でスローされた例外オブジェクトに応じてキャッチされます。それぞれのcatch文が上から順に評価されていきます。そのため、Exception型のcatchは最後に指定しないとエラーとなります。上の方にExeption型の指定をすると必ずそこでキャッチされ、下に指定したcatch文は使われないからです。