我正在运行的脚本需要一个未正确包含在我的脚本中的文件。
PHP fatal error :require_once():无法在/myDir/Net 中打开所需的 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear')/SSH2.php 第 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(整数)|运行时警告(非 fatal error )。脚本的执行不会停止。
这似乎与我之前得到的 Fatal Error
输出明显冲突。为什么在这种情况下我没有收到 E_ERROR
?这是怎么回事?
最佳答案
require
/require_once
生成警告和 fatal error 。
没有你自己的错误处理,你应该得到这样的东西:
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='.') […]
查看输出的 errstr
,您会看到 “无法打开流:没有这样的文件或目录” 部分 – 所以 的文本em>警告。
还有 description of set_error_handler告诉你,
“The following error types cannot be handled with a user defined function: E_ERROR, […]”
因此,正如预期的那样,警告被捕获了——而根据手册的说法, fatal error 并没有被捕获。
关于php - 为什么 E_WARNING 表现得像 E_ERROR?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20224532/