<?php
set_error_handler('error_handler'); // 無名関数によるコールバックは PHP5.3 から有効です
function error_handler($errno, $errstr, $errfile, $errline)
{
// エラーの種別を定数から文字列化するための対応をまとめた連想配列
$errMap = array(// match式は PHP8 から、[]による配列宣言構文は PHP5.4 から有効です
E_ERROR => 'ERROR',
E_WARNING => 'WARNING',
E_NOTICE => 'NOTICE',
E_CORE_ERROR => 'CORE_ERROR',
E_CORE_WARNING => 'CORE_WARNING',
E_COMPILE_ERROR => 'COMPILE_ERROR',
E_COMPILE_WARNING => 'COMPILE_WARNING',
E_USER_ERROR => 'USER_ERROR',
E_USER_WARNING => 'USER_WARNING',
E_USER_NOTICE => 'USER_NOTICE',
E_STRICT => 'STRICT',
// E_RECOVERABLE_ERROR => 'RECOVERABLE_ERROR', // PHP5.2 から有効な定数です
// E_DEPRECATED => 'DEPRECATED', // PHP5.3 から有効な定数です
// E_USER_DEPRECATED => 'USER_DEPRECATED', // PHP5.3 から有効な定数です
E_ALL => 'ALL',
);
// 上記のエラー種別配列からエラーの種別を文字列化
// null 合体演算子は PHP7.0 から有効です
$errLevel = isset($errMap[$errno]) ? $errMap[$errno] : 'UNKNOWN No.'.$errno;
// エラーの内容を元に例外を投げます
if (version_compare(PHP_VERSION, '5.1.0') >= 0) {
// @see https://www.php.net/manual/ja/class.errorexception.php PHP: ErrorException - Manual
// @see https://qiita.com/mpyw/items/c69da9589e72ceac470c お前は PHP 7 における Fatal Error / Catchable Fatal Error / Error / ErrorException / Exception の違いを言えるか?
// PHP のエラーを例外に変換する時のための組み込み例外クラスのインスタンスを投げる
throw new ErrorException("{$errLevel}: {$errstr} {$errfile} {$errline}", 0, $errno, $errfile, $errline);
} elseif (version_compare(PHP_VERSION, '5.0.0') >= 0) {
// PHP5.1 より前は ErrorException クラスが存在しないので代わりに Exception クラスを使う
throw new Exception("{$errLevel}: {$errstr} {$errfile} {$errline}", 0, $errno, $errfile, $errline);
}
}
// 例
echo $a;
/*
Fatal error: Uncaught ErrorException: WARNING: Undefined variable $a /in/ZBILA 32 in /in/ZBILA:32
Stack trace:
#0 /in/ZBILA(32): error_handler(2, 'Undefined varia...', '/in/ZBILA', 32)
#1 {main}
thrown in /in/ZBILA on line 32
*/
preferences:
25.54 ms | 405 KiB | 5 Q