@ 错误抑制运算符和set_error_handler

我正在遵循良好的编程实践,并且我正在将PHP错误记录到文件中,而不是将其显示给用户。我用它来做这个。set_error_handler()

现在问题来了。例如,我在某个地方:

@file_exists('/some/file/that/is/outside/openbasedir.txt');

但是,尽管有错误抑制运算符,错误消息仍会记录下来。我不想那样。我希望禁止显示的错误不传递给我的错误处理程序。


答案 1

运算符临时将 error_reporting 设置为 0,以便您可以在错误处理程序中测试 error_reporting 的值:@

if (ini_get('error_reporting') == 0) {
    return;
}

或者更好的是,仅记录error_reporting中的错误类型:

$error_reporting = ini_get('error_reporting');

if ( !($error_reporting & $errno) ) {
    return;
}

另请查看log_errorserror_log选项,用于自动将错误记录到文件或系统日志中。


答案 2

也适用于 PHP 7 的解决方案

根据PHP文档:

如果您已经使用set_error_handler()设置了自定义错误处理程序函数,那么它仍然会被调用,但是这个自定义错误处理程序可以(并且应该)调用error_reporting(),当触发错误的调用前面有一个@时,它将返回0。

资料来源:http://php.net/manual/en/language.operators.errorcontrol.php

因此,您可以在错误处理程序中使用以下代码:

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    if (error_reporting() == 0) {
        /// @ sign temporary disabled error reporting
        return;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler");

推荐