我正在尝试在PHP中创建一个错误处理程序来捕获致命错误。 捕获正常错误有效!幸运的!
但致命的错误仍然是不行的。
有人可以告诉我下面的脚本有什么问题: 太感谢了。 如果是这样意味着它已经节省了我的一天: - #
function shutdown(){
$isError = false;
if($error = error_get_last()){
switch($error['type']){
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
$isError = true;
break;
}
}
if ($isError){
echo "Script execution halted ({$error['message']})";
}
else {
echo "Script completed";
}
}
set_error_handler('errorHandler');
register_shutdown_function('shutdown');
function errorHandler( $errno, $errstr, $errfile, $errline, $errcontext){
echo 'Into '.__FUNCTION__.'() at line '.__LINE__.
"\n\n---ERRNO---\n". print_r( $errno, true).
"\n\n---ERRSTR---\n". print_r( $errstr, true).
"\n\n---ERRFILE---\n". print_r( $errfile, true).
"\n\n---ERRLINE---\n". print_r( $errline, true).
"\n\n---ERRCONTEXT---\n".print_r( $errcontext, true).
"\n\nBacktrace of errorHandler()\n".
print_r( debug_backtrace(), true);
}
function a( ){
//echo "a()'s backtrace\n".print_r( debug_backtrace(), true);
echo 'asdfasdf; // oops
}
function b(){
//echo "b()'s backtrace\n".print_r( debug_backtrace(), true);
a();
}
b();
?>
解析错误应该是可以捕获的,因为我已经使用了一个捕获解析错误的预烘焙脚本。不幸的是,剧本很糟糕。
答案 0 :(得分:2)
答案是:PHP不会执行任何带解析错误的文件。
这仍然意味着您可以捕获解析错误,但仅限于包含/必需的文件:
function shutdown() {
$isError = false;
if($error = error_get_last()){
switch($error['type']){
case E_ERROR:
case E_CORE_ERROR:
case E_COMPILE_ERROR:
case E_USER_ERROR:
case E_PARSE:
$isError = true;
break;
}
}
if ($isError){
echo "Script execution halted ({$error['message']})";
}
else {
echo "Script completed";
}
}
register_shutdown_function('shutdown');
require 'broken.php'; // File with parse error
注意我已将E_PARSE
常量添加到您的switch()
,这是您得到的错误。