以下代码按预期工作:抛出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");输出:
致命错误:无法组合命名参数和参数解包装
合并所有这些也不像预期的那样工作,来自require的require也没有被捕获。
// ...
require "unavailable_file";
function foo() {}
foo(...[], bar: "baz");输出:
致命错误:无法组合命名参数和参数解包装
这是另一个窃听器还是我漏掉了什么?
PS: PHP版本为8.0.0RC2 (cli)
发布于 2020-10-21 12:55:52
正如评论中所指出的那样,确实存在着不同致命类型的致命错误。
因为这属于“执行脚本之前生成的”类别,因此很遗憾,关闭函数将永远不会被调用。糟糕的是,我没有找到任何显示哪些致命错误属于这一类别的信息。
发布于 2020-10-22 02:56:57
是的,原来这不是虫子!
E_COMPILE_ERROR型误差
致命编译时错误.这就像一个E_ERROR,只是它是由Zend脚本引擎生成的
还有E_PARSE
编译时分析错误。解析错误只应由解析器生成。
是这种行为的唯一原因(另外,如果进程是用SIGTERM,或SIGKILL信号或exit或die在关闭函数之前调用的话)
以下是此类错误的列表
private减除methods。
https://stackoverflow.com/questions/64438091
复制相似问题