@ error suppression operator和set_error_handler

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了@ error suppression operator和set_error_handler相关的知识,希望对你有一定的参考价值。

我遵循良好的编程习惯,我将php错误记录到文件而不是将其显示给用户。我使用set_error_handler()

现在问题。例如,我有一个地方:

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

但是,尽管有错误抑制操作符,错误消息仍会记录。我不希望这样。我希望抑制错误不要传递给我的错误处理程序。

答案

@运算符暂时将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选项,以自动将错误记录到文件或syslog中。

另一答案

实际上你应该避免使用@运算符。首先,它很慢,我甚至称之为有害。

您应该拥有的是php.ini文件中有两行:

error_repoting = E_ALL | E_STRICT
display_errors = Off

...或者,如果您无法访问php.ini文件,那么在index.php(或任何其他引导程序文件)的顶部,您应该添加:

error_reporting( E_ALL | E_STRICT );
ini_set('display_errors', 0);
另一答案

解决方案也适用于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");

以上是关于@ error suppression operator和set_error_handler的主要内容,如果未能解决你的问题,请参考以下文章

Batch - 忽略FORFILES “no files found” error

即使标准输出中没有错误,cppcheck 也会返回错误

dash Python中“suppress_callback_exceptions”的作用是啥?

cppcheck --suppress 命令行参数不起作用

Xcode iOS 自动代码签名与 com.apple.developer.passkit.pass-presentation-suppression

[QNX Hypervisor 2.2用户手册]9.15 suppress