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

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アプリケーションの安全性と品質を大きく向上させるための、大切なテクニックです。

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

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

関連記事:
カテゴリの一覧へ
新着記事
New1
PHP
PHP のフォームデータの受け取り($_POST, $_GET)を完全解説!初心者向けガイド
New2
PHP
PHPのスコープとは?グローバル・ローカル・スーパーグローバルを完全解説!
New3
PHP
PHPの演算子をやさしく解説!算術・比較・論理・ビット演算子の使い方
New4
PHP
PHP の変数とは?基本的な使い方とデータ型を徹底解説!
-
人気記事
No.1
Java&Spring記事人気No1
Python
Pythonで辞書のキー・値・アイテムを取得する方法(keys(), values())
No.2
Java&Spring記事人気No2
Python
Pythonで辞書のネスト構造(入れ子辞書)を扱う方法 初心者向け完全ガイド
No.3
Java&Spring記事人気No3
Python
Pythonでエラースタックトレースを表示・取得する方法を徹底解説!初心者向け例外処理入門
No.4
Java&Spring記事人気No4
Python
PythonでMySQLに接続する方法を完全解説!初心者でもわかるpymysqlの基本
No.5
Java&Spring記事人気No5
Python
PythonでExcelファイル(.xlsx)を操作する方法を徹底解説!初心者でもできるopenpyxl・pandasの使い方
No.6
Java&Spring記事人気No6
PHP
PHPで画像ファイルをアップロードする方法を初心者向けに徹底解説!わかりやすい画像処理入門
No.7
Java&Spring記事人気No7
PHP
PHP の日付と時間の取得(date, time, strtotime)を完全解説!初心者でもわかる使い方
No.8
Java&Spring記事人気No8
PHP
PHP のデータ型を完全ガイド!初心者でもわかる int, string, float, bool など
-
-