php - 为什么 E_WARNING 表现得像 E_ERROR?

标签 php error-handling phpseclib

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

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 , 2E_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/

相关文章:

php - 什么是关键字密度以及如何在 PHP 中创建脚本?

error-handling - 从 Tell Finder block 内调用时 AppleScript 处理程序不工作

laravel - Laravel错误未传递给 View

php - 从 rsa 私钥中删除密码

php - 将 JavaScript RSA 函数转换为 PHP 函数

php - 在 Laravel 邮件中设置主题变量

php - Symfony2/ Twig : Generate Alternate Absolute URL Path for use with CDN?

php - 模型工厂与现有模型的关联

matlab - 如果 csvread 失败则跳过文件 Matlab

php - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES) using ssh tunnel connection