捕获致命的PHP错误

时间:2015-02-16 14:29:01

标签: php fatal-error shutdown

我正在尝试在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();
?>

解析错误应该是可以捕获的,因为我已经使用了一个捕获解析错误的预烘焙脚本。不幸的是,剧本很糟糕。

1 个答案:

答案 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(),这是您得到的错误。