如何显示那些被@-operator - Error Control Operators 禁用的错误?

How to display those errors which are disabled by @-operator - Error Control Operators?

我正在使用一些使用 @ 错误沉默运算符的外部库。

库正在生成一些错误,并且由于 @ 运算符隐藏了错误,因此很难指出错误发生的确切位置。

有什么方法可以在不对代码进行任何实际更改的情况下轻松禁用代码中的 @-operator 吗?

我试过 Scream Pecl 扩展,但它似乎不起作用。它适用于 PHP 5.6 版本,而我正在使用 PHP 7.

Scream 扩展已安装并在 php.ini 中使用 scream.enabled=1 启用(根据他们的文档),但错误仍然没有显示或记录。

您无法禁用 @ 符号的行为,但是您可以 log/handle 使用您自己的错误处理程序来解决这些错误。

来自docs

If you have set a custom error handler function with set_error_handler() then it will still get called,

这个运算符所做的基本上是将一个语句的 error_reporting 设置为 0。这也反映在相同的文档中:

but this custom error handler can (and should) call error_reporting() which will return 0 when the call that triggered the error was preceded by an @.

因此,假设您可以实现类似这个非常简单的实现,则需要微调细节:

function exceptional_error_handler($severity, $message, $file, $line)
{

    if (error_reporting() === 0) {
       // assuming your application always runs with `error_handling !== 0`,
       // e.g. by setting this during application bootstrap
       // that we got here means this is was a "silenced" error
       throw new \ErrorException("Silenced error! '$message'", 0, $severity, $file, $line); 
    }

    // regular (non-silenced) errors should respect your error_reporting levels
    if (!(error_reporting() & $severity)) {
        // This error code is not included in error_reporting
        return;
    }
    // everything else is converted to an exception
    throw new \ErrorException($message, 0, $severity, $file, $line);
}
set_error_handler("exceptional_error_handler");

这会将所有错误转换为异常,只需在 "silenced" 错误时用不同的消息进行注释,但您的错误处理程序可以进行日志记录或具有任何类型的自定义逻辑。

通过这样做,您可以保持 existing/third 方代码不变,只需将错误处理逻辑添加到应用程序的引导部分。

Docs for set_error_handler().