PHPで例外処理を実装していると、Throwable、Exception、Errorという3つの名前を目にすることがあります。どれもエラー処理に関係するものですが、それぞれが対象としている範囲や役割は異なります。
特にPHP 7以降では、従来のExceptionだけではなくErrorも例外処理の対象になったため、適切な使い分けを理解することが重要になりました。この記事では、Throwable・Exception・Errorの関係や、どの場面で利用すべきなのかを具体例を交えて解説します。
PHPのThrowableとは何を意味するのか
Throwableは、PHPで「投げることができるもの」を表す最上位のインターフェースです。ExceptionクラスとErrorクラスは、どちらもThrowableを実装しています。
つまり、ThrowableはExceptionやErrorをまとめて捕捉したい場合に利用するためのものです。例えば、アプリケーション全体で予期しない問題をログに記録したい場合などに便利です。
具体的には、以下のような構造になっています。
Throwable(インターフェース)
├ Exception(例外処理で発生する問題)
└ Error(PHP自体やコード上の重大な問題)
Exceptionは通常の例外処理で使用する
Exceptionは、プログラムの実行中に発生する「想定できる問題」を扱うために使用されます。例えば、ユーザー入力が不正だった場合や、データベースへの接続に失敗した場合などが該当します。
これらはプログラム側で適切に対応できる可能性が高いため、catchで補足して処理を変更したり、ユーザーへエラーメッセージを表示したりできます。
例えば、ログイン処理で入力されたユーザー情報が存在しない場合は、Exceptionを利用して以下のような流れで処理できます。
「ユーザーが存在しない」→「Exceptionを発生させる」→「catchで取得」→「ログイン失敗として表示する」というように、正常なアプリケーション制御の一部として扱えます。
ErrorはPHP内部やコード上の重大な問題を表す
Errorは、PHP 7以降で追加されたエラー階層です。以前は致命的なエラーとして扱われていたものの一部が、Throwableとして捕捉可能になりました。
代表的なものには、存在しないクラスや関数を呼び出した場合に発生するError、型宣言に違反した場合に発生するTypeErrorなどがあります。
例えば、整数を要求している関数に文字列を渡した場合、PHPではTypeErrorが発生します。このような問題は通常、プログラムの設計ミスやバグが原因であり、ユーザー操作による一時的な失敗とは性質が異なります。
Throwable・Exception・Errorはどのように使い分けるべきか
基本的な考え方として、通常のアプリケーション処理ではExceptionを利用し、予期しないPHP内部エラーまでまとめて処理したい場合にThrowableを利用します。
| 種類 | 主な用途 | 利用例 |
|---|---|---|
| Throwable | ExceptionとErrorをまとめて捕捉 | 全エラーのログ記録、最上位のエラーハンドリング |
| Exception | 想定可能な問題の処理 | 入力エラー、API失敗、DBエラー |
| Error | コードやPHP環境の重大な問題 | 型エラー、未定義クラス、構文上の問題 |
例えばWebアプリケーションのController層ではExceptionをcatchして利用者向けのエラー処理を行い、アプリケーションの最上位部分ではThrowableをcatchしてログ保存や障害通知を行う、といった構成が一般的です。
Throwableですべてcatchすれば良いわけではない理由
Throwableを使えばExceptionとErrorの両方を取得できますが、すべての処理でThrowableをcatchする設計はおすすめできません。
なぜならErrorは、本来修正すべきプログラム上の問題である場合が多く、無理に処理を続行すると予期しない動作につながる可能性があるためです。
例えば、変数の型指定ミスによるTypeErrorを無理に握りつぶして処理を続けると、後からさらに大きな不具合につながることがあります。そのため、Throwableは主に最後の安全装置として利用するのが適しています。
実際のPHP開発でおすすめされる例外処理の考え方
実務では、ユーザー操作や外部サービスとの通信など、失敗する可能性がある処理にはExceptionを使います。
一方で、アプリケーション全体を囲む部分ではThrowableを利用し、発生した問題をログへ保存します。これにより、利用者には安全なエラーページを表示しながら、開発者は原因調査に必要な情報を取得できます。
例えばECサイトの場合、決済APIの失敗はExceptionとして処理し、「決済できませんでした」と表示できます。しかし、プログラム内部の型ミスによるErrorは開発者へ通知し、修正対象として扱うべき問題になります。
まとめ
PHPのThrowable、Exception、Errorは似たように見えますが、それぞれ役割が異なります。
Exceptionはアプリケーションが想定して対応できる問題、ErrorはプログラムやPHP環境に起因する重大な問題、Throwableはそれらをまとめて扱うための仕組みです。
普段の処理ではExceptionを中心に利用し、システム全体のエラーハンドリングやログ取得などではThrowableを活用することで、安全で保守しやすいPHPアプリケーションを構築できます。


コメント