クラス内の関数で処理をしてエラーがあればExceptionでthowして呼び出し元でエラーを表示させようとしていた所次のようなエラーが出てしまいました。
Fatal error: Uncaught exception 'Exception' with message ...
エラーになったコード
<?php class User { public function getByID($ID = null) { if( !empty($ID) ) { try { // DBからデータを取ってきたりとかする } catch( PDOException $e ) { throw $e; } } else { throw new Exception('IDがないよー'); } } return $data; } $User = new User(); try { $User->getByID($ID); } catch( PDOException $e ) { echo 'ERROR: ' . $e->getMessage(); }
$ID
がなくthrow new Exception('IDがないよー');
で例外処理が帰ってくるときにFatal errorが発生していました。
エラーをthrowする側とキャッチする側が一致していないのが問題!?
Fatal errorが発生している時、例外をthrowする側はException
ですが、例外を最終的にcatchしているのがPDOException
になっているのが問題でした。
PDOException クラス はRuntimeException
クラスを継承しており
RuntimeExceptionクラスはException
クラスを継承しています。
どうやらPDOException
クラスでは継承元のException
クラスでの例外をキャッチできないので、Uncaughtというエラーになってしまっていたようです。
最終的にキャッチする部分を大本の継承元であるException
にしてしまえばエラーになりませんでした。
<?php class User { public function getByID($ID = null) { if( !empty($ID) ) { try { // DBからデータを取ってきたりとかする } catch( PDOException $e ) { throw $e; } } else { throw new Exception('IDがないよー'); } } return $data; } $User = new User(); try { $User->getByID($ID); } catch( Exception $e ) { // PDOException も Exception もココでハートキャッチ。 echo 'ERROR: ' . $e->getMessage(); }
Exception
での例外はPDOException
ではcatchできない事を利用すれば、例外の種類ごとにエラーを出し分けることもできます。
<?php class User { public function getByID($ID = null) { if( !empty($ID) ) { try { // DBからデータを取ってきたりとかする } catch( PDOException $e ) { throw $e; } } else { throw new Exception('IDがないよー'); } } return $data; } $User = new User(); try { $User->getByID($ID); } catch( PDOException $e ) { // PDOException の場合のみ echo 'PDOException: ' . $e->getMessage(); } catch( Exception $e ) { // PDOException でキャッチできなかった例外はこっち echo 'Exception: ' . $e->getMessage(); }
上の例では$ID
が無ければException: IDがないよーと表示され、
PDOのエラーとかが有った時はPDOException: ERROR MESSAGE...と表示されるようになりました。
[参考]
- PHP: 例外(exceptions) - Manual
- PHPのオブジェクト指向入門 | オブジェクト指向PHP.NET
- [PHP5]例外をキャッチ出来ない(Fatal error: Uncaught exception) - Develog - Webアプリケーション、インフラに関する記録
- 作者: 遠山光
- 出版社/メーカー: 講談社
- 発売日: 2012/12/03
- メディア: Kindle版
- この商品を含むブログを見る