设置自定义异常处理程序时,error_get_last() 在 PHP 7 中返回 NULL

ago*_*dev 3 php exception fatal-error

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

有一个包含的错误脚本,它是本文其余部分的以下内容:

错误的.php

<?php
$a = 4 // missing semicolon
$b = 2;
Run Code Online (Sandbox Code Playgroud)

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

脚本文件

<?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");
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

set_exception_handler('catchException');
Run Code Online (Sandbox Code Playgroud)

这在 PHP 5 中可以正常工作,但是在 PHP 7 中该error_get_last()函数返回NULLScreenshot)。

为什么是这样?特别令人困惑的是自定义异常处理程序是空的,例如没有“成功处理”错误。

如何防止这种情况?

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

更新:问题和解决方案

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

function catchException($e){

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

}
Run Code Online (Sandbox Code Playgroud)

Shi*_*ai7 6

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

请参阅PHP 文档

PHP 7 改变了 PHP 报告大多数错误的方式。与通过 PHP 5 使用的传统错误报告机制报告错误不同,现在大多数错误是通过抛出 Error 异常来报告的。