php-为什么E_WARNING表现得像E_ERROR?
作者:互联网
我正在运行一个脚本,该脚本需要的文件未正确包含在我的脚本中.
PHP致命错误:require_once():无法在线上/myDir/Net/SSH2.php中打开所需的’Math / BigInteger.php'(include_path = ..:/usr/share / php:/usr/share / pear’) 746
我设置了一个error_handler,它记录我得到的每个错误:
function script_error_handler($errno, $errstr, $errfile, $errline){
echo "IN ERROR HANDLER\n";
$GLOBALS['errors'][] = array(
'errno' => $errno,
'errstr' => $errstr,
'errfile' => $errfile,
'errline' => $errline
);
return true;
}
我还有一个shutdown_function,稍后会通过错误来确定成功或失败(以及其他因素).该功能的一部分会打印我记录的错误.
function shutdown_handler($io) {
print_r($GLOBALS['errors']);
echo "\n";
//irrelevant stuff ommitted
}
奇怪的是,其输出如下:
Array
(
[0] => Array
(
[errno] => 2
[errstr] => require_once(Math/BigInteger.php): failed to open stream: No such file or directory
[errfile] => /myDir/Net/SSH2.php
[errline] => 746
)
)
根据PHP的Predefined Constants,2是E_WARNING的值.
2 | E_WARNING(整数)|运行时警告(非致命错误).脚本的执行不会停止.
这似乎与我之前获得的致命错误输出明显冲突.为什么在这种情况下我没有收到E_ERROR?这里发生了什么?
解决方法:
require / require_once生成警告和致命错误.
没有您自己的错误处理,您应该会得到以下信息:
Warning: require_once(foo) [function.require-once]: failed to open stream: No such file or directory in […]
Fatal error: require_once() [function.require]: Failed opening required ‘foo’ (include_path=’.’) […]
查看输出的错误,您会看到“打开流失败:没有这样的文件或目录”部分–因此出现了警告文本.
description of set_error_handler告诉你,
“The following error types cannot be handled with a user defined function: E_ERROR, […]”
因此,正如预期的那样,捕获了警告-而按照手册所说的,致命错误不是.
标签:error-handling,phpseclib,php 来源: https://codeday.me/bug/20191030/1965695.html