不要记录被抑制的PHP警告

时间:2013-05-14 14:05:23

标签: php suppress-warnings ierrorhandler at-sign

有没有办法找出是否使用set_error_handler()函数来抑制此警告? @somethingwrong()和somethingwrong()的代码是2。但我不想记录所有警告。例如,像gzuncompress()这样的函数必须以这种方式处理,因为我无法测试有效的输入数据。

$handler = new errorHandler();
error_reporting(0);
set_error_handler(array($handler, 'handle'));
set_exception_handler(array($handler, 'exception'));
register_shutdown_function(array($handler, 'shutdown'));

class errorHandler
{
public function handle($code, $text, $file, $line)
{
    if (($code & (E_STRICT | E_NOTICE)) == 0)
        $this->log(...);
}

public function exception($exception)
{
    ...
}

public function shutdown()
{
    $e = error_get_last();
    if ($e !== NULL)
        $this->log($error);
}
}

// the errors
include('notexisting.file'); // should be logged
@gzuncompress('somenonsens'); // should not be logged

2 个答案:

答案 0 :(得分:0)

你尝试过吗?我想如果你在@gzuncompress中使用@,你就不会得到正常的警告而且你也没有调用你的错误处理程序。

答案 1 :(得分:0)

我找到了解决方案。最初,我打电话

error_reporting(E_USER_ERROR);

这会抑制除一个错误之外的所有错误,我避免自己提出这些错误,因此它永远不会发生。我这样做是因为我自己拦截了所有错误,并以四种方式中的任何一种报告它们(筛选、通过电子邮件、本地日志、PHP 日志)。我这样做也是为了避免错误报告级别为 0。

然后,在错误处理程序或关闭函数中,我可以通过改变错误报告级别的事实来检测 at 符号的使用:

if (error_reporting() != E_USER_ERROR)
    return; // Ignore this error

请注意,在 PHP 7 和 8 版本之间 at 符号的效果发生了变化。我没有在版本 8 中测试过这个。