カテゴリー:
register_shutdown_function
閲覧数:1003 配信日:2014-03-27 19:34
Fatalエラー
未定義関数呼び出し/致命的かつ復帰できない場合
・set_error_handler()だけでは、Warning:エラー(0 除算)のエラーハンドリングは出来ても、Fatal error: エラー(未定義関数呼び出し/致命的かつ復帰できない場合)のエラーハンドリングは出来ない
・これは Fatal error (致命的エラー) の箇所で、スクリプトが終了処理してしまい、ユーザー定義のエラーハンドラ関数が呼び出されないため
・処理が最後まで到達していないことは、Bye が表示されていないことからも確認できる
function my_error_handler ( $errno, $errstr, $errfile, $errline, $errcontext ) {
// echo "[$errno] $errstr $errfile($errline)\n<br />";
echo "[$errno] $errstr ($errline)\n<br />";
}
function my_shutdown_handler(){
$isError = false;
if ($error = error_get_last()){//最後に発生したエラーについての情報を取得。ここでは、foo();//未定義関数でエラー発生→Fatal error:
switch($error['type']){
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_CORE_WARNING:
case E_COMPILE_ERROR:
case E_COMPILE_WARNING:
$isError = true;
break;
}
}
if ($isError){
echo my_error_handler(
$error['type'],
$error['message'],
$error['file'],
$error['line'],
null );
}
}
ini_set( 'display_errors' , 0 );//エラー出力しない
error_reporting( E_ALL );// 全ての PHP エラーを表示(但し何を持って「全ての PHP エラー」と見做すかはバージョンにより異なる)
set_error_handler( 'my_error_handler', E_ALL );
register_shutdown_function( 'my_shutdown_handler' );
echo "Hello\n<br />";
$i = 5/0;//0 除算でエラー発生→Warning:
foo();//未定義関数でエラー発生→Fatal error:
echo "Bye\n<br />";
・処理結果
Hello
[2] Division by zero (59)
[1] Call to undefined function foo() (60)
[2] Division by zero (59)
[1] Call to undefined function foo() (60)
Fatalエラーで確かに処理が終了していることの確認
・本来ならばset_error_handlerで補足できるWarnigエラーを、敢えてregister_shutdown_functionで補足するよう設定を行い、Fatalエラーの次にWarnigエラーを発生させ、最後のWarnigエラーまで処理が到達しないことを確認(Fatalエラーで処理が終了することを確認)
・処理が最後まで到達していないことは、Bye が表示されていないことからも確認できる
function my_error_handler ( $errno, $errstr, $errfile, $errline, $errcontext ) {
// echo "[$errno] $errstr $errfile($errline)\n<br />";
echo "[$errno] $errstr ($errline)\n<br />";
}
function my_shutdown_handler(){
$isError = false;
if ($error = error_get_last()){//最後に発生したエラーについての情報を取得。ここでは、foo();//未定義関数でエラー発生→Fatal error:
switch($error['type']){
case E_ERROR:
case E_PARSE:
case E_CORE_ERROR:
case E_CORE_WARNING:
case E_COMPILE_ERROR:
case E_COMPILE_WARNING:
$isError = true;
break;
case E_WARNING://set_error_handlerで補足できるエラーを、敢えてregister_shutdown_functionで補足
$isError = true;
break;
}
}
if ($isError){
echo my_error_handler(
$error['type'],
$error['message'],
$error['file'],
$error['line'],
null );
}
}
ini_set( 'display_errors' , 0 );//エラー出力しない
error_reporting( E_ALL );// 全ての PHP エラーを表示(但し何を持って「全ての PHP エラー」と見做すかはバージョンにより異なる)
//set_error_handler( 'my_error_handler', E_ALL );
register_shutdown_function( 'my_shutdown_handler' );
echo "Hello\n<br />";
$i = 5/0;//0 除算でエラー発生→Warning:
foo();//未定義関数でエラー発生→Fatal error:
$i = 5/0;//Fatal errorで処理が終了するため、ここまで処理は到達しない
echo "Bye\n<br />";
・処理結果
Hello
[1] Call to undefined function foo() (63)
[1] Call to undefined function foo() (63)