【サクッと解説】PHP カスタムエラーハンドラーの作り方

目次

1. 本記事のポイント

  • PHPで独自のエラーハンドリング処理を組み込む方法を解説
  • set_error_handlerset_exception_handlerの使い分けを明示
  • 実務向けにログ出力・例外変換パターンまでカバー

2. PHPのカスタムエラーハンドラーとは?

PHPのカスタムエラーハンドラーとは、エラーや例外が発生した際に、独自の処理を実行するための仕組みです。

通常、PHPはエラー発生時に標準出力へエラーメッセージを表示しますが、本番環境ではログファイルへの記録や独自フォーマットでの出力が必要になるケースが多くあります。こうしたニーズに対応するため、set_error_handlerset_exception_handlerといった関数が用意されています。

これらを使うことで、アプリケーション全体で統一的なエラーログ処理を行ったり、重大な例外のみをメール通知するなどの柔軟な対応が可能になります。

とくに、実務においては以下のような場面で有効です:

  • エラー内容とスタックトレースをログに記録したいとき
  • フレームワーク外で独自の例外処理を設計したいとき
  • 通知・モニタリングとの連携(Slackやメール)を組み込みたいとき

3. 詳細解説

3-1. 基本的なカスタムエラーハンドラーの構文と登録方法

もっとも基本的な使い方として、set_error_handler関数を使います。これはPHPの警告・注意・致命的でないエラー(E_WARNINGなど)に対応します。

PHP
// カスタムエラーハンドラー関数の定義
function myErrorHandler($errno, $errstr, $errfile, $errline) {
    // エラーログに記録
    error_log("[$errno] $errstr in $errfile on line $errline");
    return true; // PHPの既定のエラーハンドラを無効化
}

// 登録
set_error_handler("myErrorHandler");

// 実行例
echo $undefinedVar; // 未定義変数アクセス:E_NOTICE

この例では、未定義変数アクセス時にカスタム処理が実行され、標準出力には表示されずログ記録のみが行われます。

3-2. 例外処理用:set_exception_handlerの利用

致命的な例外(throwされた例外オブジェクト)に対しては、set_exception_handlerを使用します。

PHP
// カスタム例外ハンドラー
function myExceptionHandler(Throwable $exception) {
    error_log("Uncaught exception: " . $exception->getMessage());
}

// 登録
set_exception_handler("myExceptionHandler");

// 実行例
throw new RuntimeException("意図的な例外");

このコードでは、RuntimeExceptionがthrowされたときに、既定の出力は抑制され、ログに記録されます。

3-3. エラーを例外に変換する(実務でよく使われるパターン)

カスタムエラーハンドラーでエラーを例外に変換することも可能です。これは統一的なtry-catchによる例外処理を行いたい場面で便利です。

PHP
set_error_handler(function($errno, $errstr, $errfile, $errline) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try {
    $x = 10 / 0; // Warning: Division by zero → 例外に変換される
} catch (ErrorException $e) {
    echo "例外として捕捉: " . $e->getMessage();
}

この方法により、警告レベルのエラーも例外として統一的に扱えます。

3-4. register_shutdown_functionとの併用による致命的エラー対応

set_error_handlerではキャッチできないE_ERRORなどの致命的なエラーは、register_shutdown_functionで対応します。

PHP
register_shutdown_function(function() {
    $error = error_get_last();
    if ($error && $error['type'] === E_ERROR) {
        error_log("致命的エラー: {$error['message']} in {$error['file']} on line {$error['line']}");
    }
});

これにより、最後に発生した致命的エラーをログに記録できます。

4. よくあるミス・誤解・落とし穴

PHPのエラーハンドリングでは、次のような誤解や注意点が存在します。

まず、set_error_handlerは致命的なエラー(E_ERROR、E_PARSEなど)を処理できない点に注意が必要です。これらはregister_shutdown_functionで補完する必要があります。

また、set_error_handler内でreturn falseを返すと、PHPの既定のエラーハンドラーが呼ばれ、エラーが画面に出力されてしまいます。ログ記録のみを行いたい場合は、必ずtrueを返すようにしましょう。

さらに、カスタムハンドラーの中で再度例外を投げる場合(例:ErrorException)、呼び出し元にtry-catch構文がないとスクリプト全体が異常終了するリスクがあるため、try-catchのスコープ設計も重要です。

5. まとめ

PHPのカスタムエラーハンドラーは、実務でのログ管理や例外統合処理に欠かせない技術です。

set_error_handlerset_exception_handlerを正しく使い分けることで、エラーへの柔軟な対応が可能になります。加えて、register_shutdown_functionを併用することで、致命的エラーへの対応も補完できます。

適切なエラーハンドリング設計は、運用上の保守性とトラブル対応の迅速化につながる重要な基盤です。

よかったらシェアしてね!
  • URLをコピーしました!
目次