カテゴリー:
register_shutdown_function
閲覧数:854 配信日:2014-03-27 19:45
0除算
・本来ならばset_error_handlerで補足できるWarnigエラーを、敢えてregister_shutdown_functionで補足
・処理が最後まで到達していることは、Bye が表示されていることからも(それもWarningエラーより前)確認できる
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()){//最後に発生したエラーについての情報を取得。ここでは、$i = 5/0;//0 除算でエラー発生→Warning 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:
//foo(;//Parse error: syntax error, unexpected ';', expecting ')'
//echo $hoge//
//echo $foo;//Parse error: syntax error, unexpected T_ECHO, expecting ',' or ';'
echo "Bye\n<br />";
・処理結果
Hello
Bye
Back to top[2] Division by zero (62)
Bye
Back to top[2] Division by zero (62)
・同じこと(Warningエラー捕捉)を、set_error_handler()で行なうと、スクリプト処理が完了したときに行なう処理ではないため、エラーメッセージは、Bye の前に表示される
function my_error_handler ( $errno, $errstr, $errfile, $errline, $errcontext ) {
// echo "[$errno] $errstr $errfile($errline)\n<br />";
echo "[$errno] $errstr ($errline)\n<br />";
}
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 (35)
Bye
[2] Division by zero (35)
Bye