前節で見たように、Exceptionクラスを使うと例外処理をさせることができます。例外処理はそれ以外にも、自分で例外クラスを作って、発生(スロー)させることもできます。
例外クラスを作成するには次のように記述します。
例外クラス定義の書式 |
---|
class 例外クラス名 extends Exception { … } |
例外をスローするには次のように記述します。
例外クラススローの書式 |
---|
throw 例外オブジェクト; |
ここで、先回作成したBusクラスを修正しましょう。今までは、乗車や降車をするときに走っていないかどうかなどを調べ、異常がある場合はその旨のメッセージを返すように作ってきました。それを例外処理に書き換えましょう。
○ ファイル
まず、独自の例外クラスを作成しましょう。次の名前のファイルを作成してください。
ファイルの種類 | PHPファイル |
---|---|
ファイル名 | WarningException.php |
○ プログラム
次のようにプログラムを入力してください。
WarningException.php
○ 解説
2行目でスーパークラスにExceptionクラスを指定しています。それにより今回作成したWarningExceptionクラスはスローしてキャッチすることができるようになります。例外を表すクラスは多くの場合~Exceptionのように名前を付けます。
4~6行目ではコンストラクタを定義しています。このコンストラクタはインスタンス生成時にスーパークラスであるExceptionクラスのコンストラクタを呼び出しています。引数として受け取ったエラーメッセージをさらに引数として渡しています。これによりgetMessageメソッドで、引数で指定したエラーメッセージが参照できるようになります。
○ ファイル
次にBusクラスを修正しましょう。
ファイルの種類 | PHPファイル |
---|---|
ファイル名 | Bus.php |
○ プログラム
次のようにプログラムを修正してください。
Bus.php
○ 解説
37、41、53、57行目では、エラーが発生した場合にその時のエラーメッセージをreturn文で返していましたが、throw文を使って例外をスローさせるように変更しました。
○ ファイル
次にBusクラスを利用するWebページを修正しましょう。「InheritanceTest.php」をコピーして「ThrowTest.php」を作成してください。
ファイルの種類 | PHPファイル |
---|---|
ファイル名 | ThrowTest.php |
○ プログラム
次のようにプログラムを修正してください。
ThrowTest.php
○ 解説
22~92行目では、try~catch文が記述されています。このブロック内で、バスオブジェクトのメソッドが呼び出されると、状態によって例外(WarningException)がスローされてきます。その場合は、92行目でキャッチされ、93行目の処理が行われます。94行目はWarningException以外がtry文の中でスローされたときにキャッチされます。
catch文は複数指定することができます。try文でスローされた例外オブジェクトに応じてキャッチされます。それぞれのcatch文が上から順に評価されていきます。そのため、Exception型のcatchは最後に指定しないとエラーとなります。上の方にExeption型の指定をすると必ずそこでキャッチされ、下に指定したcatch文は使われないからです。