在 PHP 中使用 @ 运算符抑制错误

2022-08-30 08:30:21

在您看来,使用 @ 运算符在 PHP 中抑制错误/警告是否有效,而您可能正在处理错误?

如果是这样,你会在什么情况下使用它?

欢迎使用代码示例。

编辑:回复者注意。我不想关闭错误报告,但是,例如,常见的做法是使用

@fopen($file);

然后检查之后...但是您可以通过以下方法摆脱@

if (file_exists($file))
{
    fopen($file);
}
else
{
    die('File not found');
}

或类似。

我想问题是 - 有没有任何地方必须使用@来抑制错误,无法以任何其他方式处理?


答案 1

注意:首先,我意识到99%的PHP开发人员使用错误抑制运算符(我曾经是其中之一),所以我希望任何看到这一点的PHP开发人员都不同意。

在您看来,使用 @ 运算符在 PHP 中抑制错误/警告是否有效,而您可能正在处理错误?

简短的回答:
不!

更长更正确的答案:
我不知道,因为我不了解一切,但到目前为止,我还没有遇到这是一个很好的解决方案的情况。

为什么它不好:
在我认为大约7年使用PHP的情况下,我见过由错误抑制运算符引起的无休止的调试痛苦,并且从未遇到过不可避免的情况。

问题是,您正在抑制错误的代码段目前可能只会导致您看到的错误;但是,当您更改禁止显示的行所依赖的代码或其运行环境时,该行很有可能尝试输出与您尝试忽略的错误完全不同的错误。那么,如何跟踪未输出的错误?欢迎来到调试地狱!

我花了很多年才意识到,由于被压抑的错误,我每几个月浪费多少时间。大多数情况下(但不是完全如此),这是在安装第三方脚本/应用程序/库之后,该脚本/应用程序/库在开发人员环境中没有错误,但由于php或服务器配置差异或缺少依赖项而不是我的,这通常会立即输出错误,提醒问题所在,但当开发人员添加魔术@时则不会。

替代方案(取决于情况和所需结果):
处理您知道的实际错误,以便如果一段代码将导致某个错误,那么它不会在该特定情况下运行。但我认为你得到了这一部分,你只是担心最终用户看到错误,这就是我现在要解决的问题。

对于常规错误,您可以设置错误处理程序,以便在您查看页面时以您希望的方式输出它们,但对最终用户隐藏并记录,以便您知道用户触发了哪些错误。

对于 php 中设置为关闭的致命错误(错误处理程序仍会被触发.ini并启用错误日志记录。如果您有开发服务器和实时服务器(我建议),那么在开发服务器上不需要此步骤,因此您仍然可以调试这些致命错误,而不必查看错误日志文件。甚至还有一个技巧使用关机功能向错误处理程序发送大量致命错误。display_errors

总结:
请避免。可能有一个很好的理由,但我还没有看到一个,所以直到那一天,我认为(@)错误抑制运算符是邪恶的。

如果您想了解更多信息,可以在PHP手册的错误控制操作员页面上阅读我的评论


答案 2

我会抑制错误并处理它。否则,您可能会遇到 TOCTOU 问题(检查时间、使用时间。例如,一个文件可能会在file_exists返回 true 之后,但在 fopen 之前)被删除。

但我不会只是抑制错误,让它们消失。这些最好是可见的。


推荐