こんにちは!料理があまり得意ではなく、たまに味付けに失敗するmuramatsuです。味見をすればいいのですが、味見をしていると味がだんだん分からなくなってくるので、誰かに聞くようにしました。
さてPHPでは、プログラム実行中に発生する例外エラーに対して処理を行うことができます。この記事では、Exceptionクラスの使用方法が知りたい、例外メッセージや例外コードを取得する方法が知りたいという基本的な内容から、
- 例外を拡張する方法が知りたい
- 例外をネストする方法が知りたい
といった応用的な内容に関しても解説していきます。今回はそんなExceptionの使い方についてわかりやすく解説します!
>※この記事のコードはWindows10,XAMPP7.3.0,PHP7.3.0にて動作確認を行いました。
Exceptionとは
プログラムの実行中に発生するエラーを例外といいます。PHPでは、この例外をExceptionクラスで扱います。Exceptionクラスは例外の内容を表すメッセージやコード、プログラムのどこで例外が発生したかなどの情報を持ちます。
例えば入力フォームに入力したデータが
- 何も入力されなかった
- 文字数制限を超えている
- 適切な文字または数字を入力していない
などが発生する可能性があります。こうした事項はエラー(例外)として考えられ、適切な処理をしなければなりません。例外に対して何も処理を行わないと、例外が発生した時、プログラムはそこで異常終了してしまいます。それを防ぐために、例外に応じた例外処理を行います。
例外が発生することを、例外が投げられる(throwされる)といいます。
書き方:
<?php throw new Exception(); ?>
ここでは例外をthrowしていますが、例外処理を指定していないので実行するとFatal errorと表示されます。例外処理を指定するには、投げられた例外を捕捉(catch)しなければなりません。
例外を捕捉するには、例外が投げられるコードをtryブロックで囲み、それに対応するcatchブロックを記述します。
書き方:
<?php try { // 例外が発生する可能性のあるコード } catch (Exception $e) { // 例外が発生した場合に行う処理 } ?>
例外が発生する可能性のあるコードには、例外発生とする条件や例外を投げるコードが入ります。例外発生とする条件はif文が主に使われ、例外を投げるコードはthrow new Exeption()となります。
Exceptionの使用方法
基本の使い方
例外処理を行う方法を以下に記述します。変数$argの値が10の時は例外を発生させず、0の時に例外発生としExceptionを表示させます。
サンプルプログラム:
<?php function func($arg) { echo "func start.<br>"; try { // $argが0だったら例外を投げる if ($arg == 0) { throw new Exception(); } // $argの値を表示 echo "arg=".$arg; echo "<br>"; } catch(Exception $e) { echo "catch Exception.<br>"; } echo "func end.<br>"; } func(10); // 引数10でfunc関数を実行 echo "<br>"; func(0); // 引数0でfunc関数を実行 ?>
実行結果:
func start. arg=10 func end. func start. catch Exception. func end.
func関数は、引数($arg)の値を表示する関数です。tryブロックのif ($arg == 0)で引数の値を比較し、0の場合はthrow new Exception()で例外を発生させます。最初にfunc(10);で、引数10でfunc関数を実行しています。
ここでは例外が発生しないため、tryブロックが最後まで実行され、catchブロックは実行されません。catchブロックの後の処理が実行され、func関数は終了します。次にfunc(0);で、引数0でfunc関数を実行しています。
ここでは例外が発生します。例外が発生すると、tryブロックの例外発生以降の処理は実行されず、catchブロックが実行されます。その後はcatchブロックの後の処理が実行され、func関数は終了します。
getMessageで例外メッセージを取得する
例外には例外メッセージを持たせることができます。例外メッセージはどのようなエラーが発生したかのか示すために使われます。例外メッセージを取得するには、ExceptionクラスのgetMessageメソッドを使用します。
Exceptionに例外メッセージを設定するには以下のように記述します。
書き方:
throw new Exception(‘例外メッセージ’);
メッセージは文字列なのでシングルクォーテーション(‘ ‘)またはダブルクォーテーション(“ “)で囲みます。例外に設定されたメッセージを取得するサンプルです。
サンプルプログラム:
<?php try { //文字列‘exception!!’を投げる throw new Exception('exception!!'); } catch(Exception $e) { //getMessageで例外メッセージを取得 echo $e->getMessage(); } ?>
実行結果:
exception!!
tryブロックのthrow new Exception(“exception!!”)で例外メッセージ‘exception!!’を設定します。catchブロックの$e->getMessage()で例外メッセージを取得し表示しています。
getCodeで例外コードを取得する
例外には例外コードを持たせることができます。例外コードは整数値で、例外の識別に使われます。例外コードの番号に決まりは特になく、自分で設定するか、開発しているプロジェクト、アプリケーションによって設定します。例外コードを取得するには、ExceptionクラスのgetCodeメソッドを使用します。また、Exceptionに例外コードを設定するには以下のように記述します。
書き方:
throw new Exception(‘例外メッセージ’, 例外コード);
例外に設定されたコードを取得するサンプルです。
サンプルプログラム:
<?php try { //999というコードを設定 throw new Exception('exception!!', 999); } catch(Exception $e) { //コードを取得し出力する echo $e->getCode(); } ?>
実行結果:
999
tryブロックのthrow new Exception(‘exception!!’, 999)で例外メッセージと例外コードを設定します。catchブロックの$e->getCode()で例外コードを取得し、表示しています。
例外を拡張して独自の例外クラスを定義する
Exceptionクラスを拡張し、独自の例外クラスを使用することもできます。例外クラスを拡張するとは、Exeption(例外)クラスを継承します。独自の例外を処理するサンプルです。
サンプルプログラム:
<?php class MyException1 extends Exception { } class MyException2 extends Exception { } try { throw new MyException2(); } catch(MyException1 $e) { echo 'MyException1'; } catch(MyException2 $e) { echo 'MyException2'; } ?>
実行結果:
MyException2
クラスMyException1・MyException2はExceptionを拡張したクラス(子クラス)で、Exceptionと同様に例外として投げたり捕捉することができます。またcatchブロックは複数記述することができ、発生した例外に該当するcatchブロックが実行されます。
throw new MyException2()で例外を発生させ、catch(MyException2 $e)で捕捉しています。ひとつめのcatchブロックcatch(MyException1 $e)はMyException1を捕捉するブロックなので、ここでは実行されません。
ネストしてgetPreviousで前の例外情報を取得する
PHP5.3から、例外をネストさせることができるようになりました。例外のネストとは、tryブロックの中に別のtry-catchブロックを記述することを言います。これにより、前の例外の情報を持ちながら別の例外を投げれるようになります。
以下のサンプルでは、内側のtryブロックで発生したMyExceptionをExceptionの第三引数に指定し、外側のcactchブロックで捕捉するように投げています。なお、第三引数に指定した例外は前の例外としてExceptionクラスのgetPreviousメソッドで取得することができます。
サンプルプログラム:
<?php //Exceptionクラスを拡張 class MyException extends Exception { } try { try { throw new MyException('MyException', 111); } catch(MyException $me) { //MyExceptionを第三引数$meに指定 throw new Exception('Exception', 999, $me); } //指定されたMyExceptionを捉える } catch(Exception $e) { //↓前の例外を取得して$prevに代入 $prev = $e->getPrevious(); //前の例外のメッセージ‘MyException’を取得 echo $prev->getMessage(); echo "<br>"; //前の例外のコード111を取得 echo $prev->getCode(); } ?>
実行結果:
MyException 111
$prev = $e->getPrevious()で前の例外MyException(‘MyException’, 111)を$prevに代入しています。そのため、$prev->getMessage()で”MyException”$prev->getCode()で111が取得できています。
まとめ
今回はExceptionの使い方について解説しました。実際のシステム構築では異常終了を避けるため、例外処理はかかせません。Exceptionの使い方を忘れてしまったら、この記事を思い出して下さい!