2

以下代码按预期工作:抛出 ErrorException 并为由生成的致命错误调用关闭函数require

register_shutdown_function(function() {
    echo "anyway, hello world\n";
});

set_error_handler(function($severity, $message, $file, $line) {
    throw new ErrorException($message, 0, $severity, $file, $line);
});

set_exception_handler(function($exception) {
    echo $exception->getMessage().PHP_EOL;
});

require "unavailable_file";

输出:

require(unavailable_file):无法打开流:没有这样的文件或目录

无论如何,你好世界

但是命名参数产生的致命错误无法调用异常处理程序和关闭函数

// replacing require in the previous code with the following

function foo() {}

foo(...[], bar: "baz");

输出:

致命错误:无法组合命名参数和参数解包

将它们全部结合起来也没有按预期工作,并且没有捕获到ErrorExceptionfromrequire

// ... 

require "unavailable_file";

function foo() {}

foo(...[], bar: "baz");

输出:

致命错误:无法组合命名参数和参数解包

那么这是另一个错误还是我在这里遗漏了什么?

PS: PHP版本为8.0.0RC2(cli)

4

2 回答 2

1

正如评论中所指出的,这确实是不同致命类型的致命错误的情况。

由于这属于“在执行脚本之前生成”的类别,不幸的是永远不会调用关闭函数。太糟糕了,我没有找到任何显示哪些致命错误属于此类别的信息。

于 2020-10-21T12:55:52.040 回答
1

是的,事实证明这不是错误!

类型错误E_COMPILE_ERROR

致命的编译时错误。这类似于 E_ERROR,只是它是由 Zend 脚本引擎生成的

并且E_PARSE

编译时解析错误。解析错误只能由解析器生成

是这种行为的唯一原因(加上如果进程被 SIGTERM 或 SIGKILL 信号杀死,或者exitdie关闭函数之前被调用)

这是此类错误的列表

  1. https://3v4l.org/oO4L7 => 重新声明一个函数
  2. https://3v4l.org/cNHbu =>private抽象方法
  3. https://3v4l.org/jPpIU => 访问级别必须相同或限制较少
于 2020-10-22T02:56:57.720 回答