0

为什么 Zend\Log 会破坏跟随错误处理功能?

function error_handler($errno, $errstr, $errfile, $errline, $errcontext = null)
{
    global $Logger;
    
    $Logger->log(6 , "Error '$errstr' received.<br>");
    return true;
}

$Logger = new \Zend\Log\Logger;
$Logger->addWriter(new \Zend\Log\Writer\Null);

set_error_handler('error_handler');

trigger_error('a', E_USER_ERROR);
trigger_error('b', E_USER_ERROR);
trigger_error('c', E_USER_ERROR);
trigger_error('d', E_USER_ERROR);

echo 'done.';

如果删除 $Logger->log() 行,脚本将按预期执行:

完毕。

保留脚本中的日志记录行在第二个 E_USER_ERROR 处终止。

致命错误:第 37 行 Z:\Workspace\xampp\htdocs\tests\error.php 中的 b

同样,如果您将错误级别更改为 E_USER_WARNING:

警告:第 37 行 Z:\Workspace\xampp\htdocs\tests\error.php 中的 b

警告:第 38 行 Z:\Workspace\xampp\htdocs\tests\error.php 中的 c

警告:第 39 行 Z:\Workspace\xampp\htdocs\tests\error.php 中的 d

完毕。

4

1 回答 1

0
function error_handler($errno, $errstr, $errfile, $errline, $errcontext = null)
{
    global $Logger;

    $Logger->log(6 , "Error '$errstr' received.<br>");
    set_error_handler ('error_handler');
    return true;
}

$Logger = new \Zend\Log\Logger;
$Logger->addWriter(new \Zend\Log\Writer\Null);

set_error_handler('error_handler');

trigger_error('a', E_USER_ERROR);
trigger_error('b', E_USER_ERROR);
trigger_error('c', E_USER_ERROR);
trigger_error('d', E_USER_ERROR);

echo 'done.';

似乎它在过程中丢失了错误处理程序。不知道为什么。另外,请记住,E_USER_ERROR 与 E_ERROR 非常相似,用于发出不可恢复的错误。所以也许这种行为毕竟是合理的。

于 2013-11-10T23:02:40.060 回答