为什么E_WARNING表现得像E_ERROR?

时间:2013-11-26 17:58:14

标签: php error-handling phpseclib

我正在运行一个脚本,该脚本需要一个未正确包含在我的脚本中的文件。

PHP Fatal error: require_once(): Failed opening required 'Math/BigInteger.php' (include_path='.:/usr/share/php:/usr/share/pear') in /myDir/Net/SSH2.php on line 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 Constants2E_WARNING的值。

2 | E_WARNING (integer) | Run-time warnings (non-fatal errors). Execution of the script is not halted.

这似乎与我之前获得的Fatal Error输出明显冲突。为什么我在这种情况下得不到E_ERROR?这是怎么回事?

1 个答案:

答案 0 :(得分:4)

require / require_once生成警告致命错误。

如果没有自己的错误处理,你应该得到这样的东西:

  

警告:require_once(foo)[function.require-once]:无法打开流:[...]

中没有此类文件或目录      

致命错误:require_once()[function.require]:无法打开所需的'foo'(include_path ='。')[...]

查看输出的errstr,您会看到“无法打开流:没有此类文件或目录”部分 - 因此警告的文本

description of set_error_handler告诉你,

  

“使用用户定义的函数无法处理以下错误类型:E_ERROR,[...]”

因此警告按照预期被捕获 - 并且根据手册所说的,致命错误不是。