【问题标题】:error_get_last() returns NULL in PHP 7 when a custom exception handler is set当设置自定义异常处理程序时,error_get_last() 在 PHP 7 中返回 NULL
【发布时间】:2018-05-23 12:53:12
【问题描述】:

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

本文的其余部分包含一个包含错误的脚本:

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() 函数返回 NULL (Screenshot)。

问题

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

如何预防?

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

更新:问题和解决方案

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

function catchException($e){

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

}

【问题讨论】:

    标签: php exception fatal-error


    【解决方案1】:

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

    PHP docs:

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

    【讨论】:

    • 另外,你可以让 PHP5 在这方面表现得像 PHP7,见stackoverflow.com/a/32822054/1067003
    • 哇,酷。这解释了这种行为。因此,默认的异常处理程序将异常作为错误转发。非常感谢您的解释!
    猜你喜欢
    • 1970-01-01
    • 2016-08-03
    • 2017-04-16
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多