好的,这花了一些时间来分解它。这是:
在本文的其余部分中有一个包含错误的脚本,如下所示:
<?php
$a = 4 // missing semicolon
$b = 2;
然后考虑以下脚本来处理错误。请注意,自定义异常处理程序最初未注册。
<?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>";
}
答案 0 :(得分:4)
PHP 7抛出ParseError
异常,而不是触发E_PARSE
类型的错误。如果遇到未捕获的异常,则默认异常处理程序似乎会触发错误。但是,如果您将其替换为set_exception_handler()
,则除非您自己执行此操作,否则不会再发生此事。
请参阅PHP docs:
PHP 7改变了PHP报告大多数错误的方式。不是通过PHP 5使用的传统错误报告机制报告错误,而是通过抛出错误异常来报告大多数错误。