error_get_last() returns NULL in PHP 7 当设置自定义异常处理程序时

error_get_last() returns NULL in PHP 7 when a custom exception handler is set

好的,这需要一些时间来分解它。在这里:

包含一个错误的脚本,该脚本的其余部分如下所示 post:

faulty.php

<?php
$a = 4 // missing semicolon
$b = 2;

然后考虑使用以下脚本来处理错误。请注意,自定义异常处理程序最初未注册。

script.php

<?php

// disable default display of errors
ini_set('display_errors', 0);

// register functions
#set_exception_handler('catchException'); // initially not set
register_shutdown_function('catchError');

// define error function
function catchError(){

  echo "PHP version: ".phpversion();

  if(is_null(error_get_last())) echo "<h1>No errors fetched!</h1>";
  else                          echo "<h1>Error fetched:</h1>";

  var_dump(error_get_last());

}

// define exception function (not used in all examples)
function catchException(){}

// include faulty script
include("D:/temp/faulty.php");

没有自定义异常处理程序的结果

PHP 5 和 7 的结果相同。 error_get_last() 函数 returns 最后发生的错误 (Screenshot).

带有自定义错误处理程序的结果

现在我们设置一个自定义函数取消注释行

set_exception_handler('catchException');

这在 PHP 5 中可以正常工作,但是在 PHP 7 中 error_get_last() 函数 returns NULL (Screenshot)。

问题

这是为什么?特别令人困惑,因为自定义异常处理程序是空的,例如不是 "successfully handling" 错误。

如何防止这种情况?

祝一切顺利,感谢您的提示!

更新:问题及解决方案

事情(不是真正的问题)是 PHP 7 抛出 ParseError 类型的异常,而不是产生错误。因此,最好使用异常处理程序来处理。制作一个很好的异常处理程序来很好地处理异常:

function catchException($e){

  echo "<h1>".get_class($e)."</h1>";
  echo $e->getMessage()."<br>";

}

PHP 7 抛出 ParseError 异常,而不是触发 E_PARSE 类型的错误。如果遇到未捕获的异常,默认异常处理程序似乎会触发错误。但是,如果你用 set_exception_handler() 替换它,除非你自己做,否则它不会再发生。

参见PHP docs

PHP 7 changes how most errors are reported by PHP. Instead of reporting errors through the traditional error reporting mechanism used by PHP 5, most errors are now reported by throwing Error exceptions.