1

有没有办法找出这个警告是否被抑制或没有使用 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
4

2 回答 2

0

你试过了吗?我认为如果您在@gzuncompress 中使用@,您将不会收到正常警告,并且您也不会调用错误处理程序。

于 2013-05-14T14:31:19.930 回答
0

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

error_reporting(E_USER_ERROR);

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

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

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

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

于 2021-06-28T15:46:21.673 回答