PHPのset_exception_handlerを完全ガイド!初心者でも理解できる例外処理カスタマイズ
生徒
「PHPでエラーじゃなくて“例外”が発生したときに、自分の好きな処理をさせることってできるんですか?」
先生
「できますよ。PHPには set_exception_handler() という特別な機能があり、プログラム中で未処理の例外が発生したとき、自分で作った関数を呼び出せます。」
生徒
「なるほど!普通のエラーとは違うんですよね?どんな場面で使うんですか?」
先生
「たとえばデータベース接続が失敗したときに、画面にはエラーを見せず、内部だけでログを記録したり、管理者にメールで通知したりできます。では詳しく解説していきましょう。」
1. PHPのset_exception_handlerとは?
set_exception_handler() は、PHPで例外処理(Exception)をカスタマイズするための関数です。
通常、例外が発生するとプログラムはそこで止まり、エラーメッセージが画面に表示されます。
しかし本番環境でエラーメッセージがユーザーに表示されると、セキュリティリスクにつながるだけでなく、ユーザー体験も悪くなります。
そこで set_exception_handler() を使うことで、
未処理の例外が発生したときに「自動で呼ばれる自作の処理」を登録できます。
これにより、例外の記録、メール通知、カスタム画面の表示など、柔軟な対応が可能になります。
2. set_exception_handlerの基本的な使い方
基本の流れはとてもシンプルで、自分で例外を処理する関数を作り、それを set_exception_handler() に登録するだけです。
function myExceptionHandler($exception) {
error_log("例外発生: " . $exception->getMessage());
echo "問題が発生しました。時間をおいて再度お試しください。";
}
set_exception_handler("myExceptionHandler");
// テスト用に例外を発生
throw new Exception("テスト例外");
このコードを実行すると、例外が発生しても画面に生々しいエラーは表示されず、 「問題が発生しました」というメッセージだけがユーザーに見えます。 そして内部ではログに保存されているため、後からエラーの内容を確認できます。
3. 例外(Exception)とは?エラーとの違いをわかりやすく解説
初心者がつまずきやすいポイントとして「エラーと例外の違い」があります。 エラーは「プログラムが正しく動かない状態」のことで、PHPが自動で発生させます。 一方、例外は「開発者が意図的に発生させることができる特別なエラー」のようなものです。
たとえば「買い物かごが空なのに購入処理をしようとした」など、プログラムの条件が満たされていないときに例外を投げることができます。
if (empty($cart)) {
throw new Exception("カートが空です");
}
4. set_exception_handlerに渡される例外の情報
例外ハンドラーには $exception が渡されます。
このオブジェクトからは次の情報を取得できます。
- 例外メッセージ(
$exception->getMessage()) - 例外が起きたファイル名(
$exception->getFile()) - 例外が起きた行番号(
$exception->getLine()) - 例外の種類(クラス名)(
get_class())
これらを組み合わせることでログ出力を強化したり、重要な内容を管理者に通知できます。
5. 実務でよく使うカスタム例外ハンドラー
実務では、例外発生を「ログに保存する」「管理者にメールを送る」「ユーザーには安全な画面を表示する」の3つを同時に行うことが多いです。
function customExceptionHandler($exception) {
$log = "[" . date("Y-m-d H:i:s") . "] "
. $exception->getMessage()
. " (" . $exception->getFile() . ":" . $exception->getLine() . ")\n";
error_log($log, 3, __DIR__ . "/exception.log");
echo "<h2>現在システムに問題が発生しています。</h2>";
}
set_exception_handler("customExceptionHandler");
// 例外発生
throw new Exception("データベースに接続できませんでした");
このコードでは、
- 例外の詳細をログへ保存
- ユーザーには安全なメッセージのみ表示
- プログラムの強制終了を防ぐ
という処理を行っています。
6. set_exception_handlerを使う際の注意点
● 注意1:catchされなかった例外だけ処理できる
set_exception_handler() は「try...catchで捕まえられなかった例外」だけ処理します。
逆に言えば、catchしてしまうとハンドラーは動きません。
● 注意2:Fatal Errorは処理できない
エラーと例外は別物なので、Fatal Error(致命的エラー)はこのハンドラーでは扱えません。
Fatal Error対応には register_shutdown_function() を組み合わせる方法があります。
● 注意3:本番環境では絶対にエラーメッセージを見せない
内部の構造を外部に見せるのはセキュリティリスクです。 例外ハンドラーでは、画面にはやさしいメッセージだけ出すようにしましょう。
7. set_error_handlerとの違い
初心者の方は「エラー」と「例外」の違いで混乱しがちです。 そこで簡単に整理します。
| set_error_handler() | Notice / Warning などPHPのエラーを処理 |
|---|---|
| set_exception_handler() | 未処理の例外(Exception)を処理 |
多くのアプリでは、この2つを組み合わせて「エラーも例外も安全に処理できる環境」を整えます。