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

时间:2017-12-09 12:21:28

标签: php exception fatal-error

好的,这花了一些时间来分解它。这是:

在本文的其余部分中有一个包含错误的脚本,如下所示:

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()函数返回最后一个错误的错误(Screenshot)。

自定义错误处理程序

的结果

现在我们设置一个取消注释行

的自定义功能
set_exception_handler('catchException');

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

问题

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

如何防止这种情况?

一切顺利并感谢提示!

更新:问题和解决方案

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

function catchException($e){

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

}

1 个答案:

答案 0 :(得分:4)

PHP 7抛出ParseError异常,而不是触发E_PARSE类型的错误。如果遇到未捕获的异常,则默认异常处理程序似乎会触发错误。但是,如果您将其替换为set_exception_handler(),则除非您自己执行此操作,否则不会再发生此事。

请参阅PHP docs

  

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