编程语言
首页 > 编程语言> > php-为什么E_WARNING表现得像E_ERROR?

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