カテゴリ: PHP 更新日: 2026/05/23

PHP の set_error_handler を完全解説!初心者でもわかる独自エラーハンドリングの作り方

PHP の set_error_handler() を使った独自エラーハンドリング
PHP の set_error_handler() を使った独自エラーハンドリング

先生と生徒の会話形式で理解しよう

生徒

「PHPでエラーが出たときに、自分で好きな方法で処理することってできますか?」

先生

「できますよ。PHPには set_error_handler() という仕組みがあり、エラーが起きたときに自分で作った関数を呼び出すことができます。」

生徒

「自分でエラー処理を作れるって便利ですね!どんな場面で使うんですか?」

先生

「たとえば開発中にエラーの内容をわかりやすく表示したり、本番環境でエラーをユーザーに見せないようにして裏でログだけ記録したりできます。では実際に仕組みから解説していきましょう!」

1. PHP の set_error_handler() とは?

1. PHP の set_error_handler() とは?
1. PHP の set_error_handler() とは?

PHPの set_error_handler() は、「エラーが発生したときに呼び出される関数を、自分で指定できる仕組み」です。これを使うと、通常であればブラウザに直接表示されるエラー内容を、あなたの好きな処理で受け取り、ログに保存したり、メール通知したり、画面にはやさしいメッセージを表示することができます。

たとえば、通常ならPHPはエラーが発生すると画面に内容を表示します。しかし本番環境ではエラー内容がユーザーに見えてしまうと危険です。サーバーのファイル名や内部構造が漏れてしまう可能性があるためです。そこで set_error_handler() を使えば、画面には「問題が発生しました」とだけ表示し、内部ではエラーログに記録することができます。

2. 独自エラーハンドラーの基本構造

2. 独自エラーハンドラーの基本構造
2. 独自エラーハンドラーの基本構造

独自のエラーハンドリングを作るには、「自分で関数を作り、それを set_error_handler() に登録する」という流れになります。イメージとしては「エラーをキャッチする専用の窓口を自分で作る」ような感じです。


function myErrorHandler($errno, $errstr, $errfile, $errline) {
    error_log("[Error $errno] $errstr ($errfile:$errline)");
    echo "エラーが発生しました。しばらくしてから再度お試しください。";
}

set_error_handler("myErrorHandler");

上記の例では、エラーが発生すると myErrorHandler() が呼ばれます。そしてエラー内容をログに保存して、画面にはユーザー向けメッセージを表示します。

この仕組みを知ることで、エラー対応が一気にレベルアップします。本番環境でエラーが出てもユーザーは気づかず、裏側だけでログを確認できるようになるため、セキュリティ面にも強くなります。

3. set_error_handler のパラメータの意味

3. set_error_handler のパラメータの意味
3. set_error_handler のパラメータの意味

set_error_handler() に登録する関数は、基本的に次の4つのパラメータを受け取ります。

  • $errno:エラーの種類(Warning など)
  • $errstr:エラーの内容(メッセージ)
  • $errfile:エラーが起きたファイル名
  • $errline:エラーが起きた行番号

これらの情報を使えば、エラーの原因を特定しやすくなり、ログとして保存する際にもとても役に立ちます。

4. カスタムハンドラーでエラーをログに記録する

4. カスタムハンドラーでエラーをログに記録する
4. カスタムハンドラーでエラーをログに記録する

実際にエラー内容をログファイルに記録しつつ、画面には出さない例を紹介します。


function logOnlyHandler($errno, $errstr, $errfile, $errline) {
    $log = date("Y-m-d H:i:s") . " [$errno] $errstr ($errfile:$errline)";
    error_log($log, 3, __DIR__ . "/error.log");
}

set_error_handler("logOnlyHandler");

// わざとエラーを発生
echo $undefined;

このコードで実行される流れは次の通りです。

  1. 未定義変数 $undefined を使いエラー発生
  2. logOnlyHandler が呼ばれる
  3. エラー内容が error.log に保存される
  4. 画面には何も表示されない

こうすることで、ユーザーには一切エラー情報を見せず、管理側だけがログを確認できる仕組みが作れます。

5. set_error_handler を使うときの注意点

5. set_error_handler を使うときの注意点
5. set_error_handler を使うときの注意点

非常に便利な set_error_handler() ですが、いくつか注意点があります。

● 注意1:Fatal Error には対応できない

set_error_handler() は Notice や Warning を処理できますが、Fatal Error(致命的エラー)は処理できません。これはPHPが実行を続けられない種類のエラーだからです。

● 注意2:エラーを無視しないようにする

ログを記録せずに何も表示しない設計にすると、不具合に気づけなくなります。必ずログには記録するようにしましょう。

● 注意3:本番環境と開発環境で使い分ける

開発環境ではエラーを画面に表示、本番では非表示でログに保存、など使い分けが必要です。環境ごとに設定できるようにしておくと便利です。

6. 実務でよく使われるエラーハンドリングの構成例

6. 実務でよく使われるエラーハンドリングの構成例
6. 実務でよく使われるエラーハンドリングの構成例

最後に、実務でよく使われる構成例を紹介します。


function errorHandler($errno, $errstr, $errfile, $errline) {

    $log = "[" . date("Y-m-d H:i:s") . "] ($errno) $errstr in $errfile on line $errline\n";
    error_log($log, 3, __DIR__ . "/runtime_error.log");

    if ($errno === E_USER_ERROR) {
        echo "重大な問題が発生しました。";
    }
}

set_error_handler("errorHandler");

この方法だと、エラーの種類を判断しながら処理を変えたり、重要なエラーだけ通知することができるようになります。PHPアプリケーションの安全性と品質を大きく向上させるための、大切なテクニックです。

まとめ

まとめ
まとめ

set_error_handler の理解を深めるポイント

本記事では、PHPにおけるエラーハンドリングの中でも特に重要な set_error_handler() の仕組みについて詳しく解説してきました。エラー処理は単なるデバッグのための機能ではなく、システムの品質やセキュリティを大きく左右する重要な要素です。特にWebアプリケーション開発においては、ユーザーに不要な情報を見せない設計が求められるため、独自のエラーハンドリングは必須のスキルと言えるでしょう。

set_error_handler() を使うことで、PHPが標準で出力するエラーメッセージをそのまま表示するのではなく、自分で制御できるようになります。これにより、開発環境では詳細なエラー情報を表示し、本番環境ではユーザーに優しいメッセージだけを表示しつつ、内部ではログに記録するという柔軟な設計が可能になります。

エラーハンドリングとログ管理の重要性

エラーハンドリングを適切に行うことで、バグの早期発見やシステム障害の原因特定が容易になります。特に error_log() と組み合わせて使用することで、発生したエラーをファイルに記録し、後から分析できるようになります。これは大規模なシステム開発だけでなく、小規模なプロジェクトでも非常に役立つ実践的なテクニックです。

また、エラー内容にはファイルパスや内部構造などの機密情報が含まれることが多いため、これをそのままユーザーに表示するのは危険です。独自エラーハンドラーを実装することで、セキュリティ対策としても非常に有効になります。

実務で活かせる設計の考え方

実務では、単にエラーを処理するだけでなく、エラーの種類ごとに対応を変えることが重要です。例えば、軽微な警告(Warning)はログに残すだけにし、重大なエラー(Fatalに近いもの)は管理者へ通知するなど、状況に応じた処理設計が求められます。

また、開発環境と本番環境で挙動を切り替える設計も重要です。環境変数や設定ファイルを使って、エラー表示の有無やログ出力先を変更できるようにしておくと、より柔軟で安全なシステムになります。

サンプルプログラムで振り返る


function customErrorHandler($errno, $errstr, $errfile, $errline) {

    // ログ用メッセージ生成
    $message = "[" . date("Y-m-d H:i:s") . "] ";
    $message .= "Error:$errno ";
    $message .= "$errstr in $errfile on line $errline\n";

    // ログファイルへ出力
    error_log($message, 3, __DIR__ . "/app_error.log");

    // ユーザー表示制御
    if ($errno === E_USER_ERROR) {
        echo "重大なエラーが発生しました。管理者へ連絡してください。";
    } else {
        echo "現在システムで問題が発生しています。";
    }
}

// ハンドラー登録
set_error_handler("customErrorHandler");

// テスト用エラー
echo $testUndefined;

上記のように、エラーハンドラーを一元管理することで、コード全体の保守性が向上します。複数のファイルで個別にエラー処理を書く必要がなくなり、修正や改善も一箇所で対応できるようになります。

先生と生徒の振り返り会話

生徒

「set_error_handlerって、ただのエラー表示を変えるだけかと思っていましたが、ログ管理やセキュリティにも関係しているんですね。」

先生

「その通りです。エラーハンドリングはシステムの信頼性を支える重要な仕組みです。特に本番環境では、ユーザーに内部情報を見せない設計が欠かせません。」

生徒

「ログに残すことで、あとから原因を調べられるのも便利ですね。デバッグがしやすくなりそうです。」

先生

「そうですね。さらに、エラーの種類によって処理を変えることで、より実践的なシステムになります。たとえば重要なエラーだけ通知する仕組みも作れます。」

生徒

「開発環境と本番環境で動作を変えるのも大事だと分かりました。実務で役立ちそうです!」

先生

「いい理解です。今回学んだset_error_handlerの使い方を活用すれば、より安全で保守性の高いPHPアプリケーションを作れるようになりますよ。」

コメント
コメント投稿は、ログインしてください

まだ口コミはありません。

関連記事:
PHP のエラーハンドリングの記事一覧へ
新着記事
New1
PHP
PHPのエラーハンドリングを完全ガイド!初心者でもわかるHTTPステータスコードの基礎と使い方
New2
PHP
PHPでファイルの存在確認・削除・移動を行う方法!初心者向けにfile_exists・unlink・renameを解説
New3
Python
Pythonでネットワークスキャナーを作る方法!Scapy入門ガイド(初心者向け)
New4
ChatGPT
ChatGPTでPythonのバグを見つける方法!初心者が確認すべきチェックポイント
人気記事
No.1
Java&Spring記事人気No1
PHP
PHPの配列をソートする方法!sort, rsort, asort, ksortの使い方を丁寧に解説します!
No.2
Java&Spring記事人気No2
ChatGPT
ChatGPTでPythonコード作成とは?初心者向けに使い方・メリット・注意点を徹底解説
No.3
Java&Spring記事人気No3
Python
PythonでAPIリクエストを送信する方法を完全解説!requestsライブラリで簡単API通信
No.4
Java&Spring記事人気No4
Python
Pythonのrequestsライブラリ完全入門!HTTPリクエストの送り方を初心者向けにやさしく解説
No.5
Java&Spring記事人気No5
Python
Pythonの非同期HTTPリクエスト(asyncio + aiohttp)完全ガイド!初心者でもわかるネットワークプログラミング
No.6
Java&Spring記事人気No6
Python
Pythonのtimedeltaで日付の加算・減算をしよう!初心者でもわかる時間操作の基本
No.7
Java&Spring記事人気No7
Python
Pythonでzip圧縮・解凍する方法を徹底解説!初心者でもわかるzipfileモジュールの使い方
No.8
Java&Spring記事人気No8
PHP
PHPの変数の命名規則とベストプラクティスをやさしく解説!初心者向け完全ガイド