Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
Fatal error を set_error_handler で登録されたハンドラで捕捉する方法。 Parse error は捕捉できません。
<?php
// エラーの表示をオフ
ini_set('display_errors', 0);
// エラーは全て捕捉する
error_reporting(E_ALL);
// エラーハンドラを設定
set_error_handler('my_error_handler');
// エラー格納用グローバル変数
$errors = array();
// 出力バッファリングの有効化
ob_start();
// 自動フラッシュをオフ
ob_implicit_flush(false);
// 自作エラーハンドラ
function my_error_handler($errno, $errstr, $errfile, $errline, $errcontext) {
global $errors;
// エラーレベルによって補則するエラーを判断する。
if ((error_reporting() & $errno) === $errno) {
// エラーメッセージの作成
$errors[] = "[$errno] $errstr $errfile($errline)\n";
}
// エラーの表示をオフにしてるので意味なし。
return true;
}
// shutdown処理の登録
register_shutdown_function(function() {
global $errors;
// バッファの取得
$ob = ob_get_clean();
// シャットダウン前に起こったエラーを取得
$error = error_get_last();
// エラーがあれば自作のエラーハンドラを呼び出す
if (!empty($error)) {
if (my_error_handler(
$error['type'],
$error['message'],
$error['file'],
$error['line'],
null
)) {
// 返り値が true の時バッファから Fatal error の出力を消す必要あり。
// が、これ xdebug とか入れてると出力方法が変わったりするので、難しい。
}
}
// 本来 ob_get_contents と ob_flush とかでやるのが行儀のよい書き方なんだろうけども、
// まぁ、サンプルなんで。
if (!empty($ob)) {
echo $ob;
}
// 格納したエラーを出力
foreach($errors as $error) {
echo $error;
}
});
echo 'start';
// 宣言していない変数をechoしてnotice
echo $test;
// 存在しないクラスを呼んでfatal errorを起こす
NotExsistsClass::hogehoge();
echo 'end';
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.