在PHP中用@操作符来抑制错误

在你看来,使用@操作符来抑制PHP中的错误/警告是有效的,而你可能正在处理错误?

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

代码示例是受欢迎的。

编辑:注意到repliers。 我不打算关闭错误报告,但是,例如,通常的做法是使用

@fopen($file);

然后再检查......但你可以通过这样做来消除@

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

或类似的。

我想问题是 - 有没有地方可以用来抑制一个错误,不能以任何其他方式处理?


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

但我不会仅仅为了让他们离开而压制错误。 这些更好地可见。


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

在你看来,使用@操作符来抑制PHP中的错误/警告是有效的,而你可能正在处理错误?

简短的回答:
没有!

更多更正确的答案:
我不知道,因为我什么都不知道,但到目前为止,我还没有遇到过这种情况,这是一个很好的解决方案。

为什么这么糟糕:
在我认为现在使用PHP大约7年的时间里,我已经看到了由错误抑制操作员造成的无尽调试痛苦,并且从未遇到过无法避免的情况。

问题在于,你压制错误的那段代码目前可能只会导致你所看到的错误; 但是,当您更改被抑制行所依赖的代码或其运行环境时,则该行将尝试从您试图忽略的行输出完全不同的错误。 那么如何找出一个不输出的错误呢? 欢迎来到调试地狱!

我花了很多年才意识到,由于抑制错误,我每隔几个月浪费了多少时间。 大多数情况下(但不是完全),这是在开发人员环境中安装了第三方脚本/应用程序/库,它们没有错误,但不是我的,因为php或服务器配置不同或缺少依赖关系,通常会立即输出错误提醒问题是什么,但是当开发者添加magic @时不会。

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

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

对于致命错误,请在您的php.ini中将display_errors设置为off(您的错误处理程序仍然被触发)并启用错误日志记录。 如果你有一个开发服务器和一个活动服务器(我建议),那么你的开发服务器不需要这一步,所以你仍然可以调试这些致命错误,而不必诉诸于错误日志文件。 使用关机功能甚至有一招可以将大量的致命错误发送给错误处理程序。

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

如果您需要更多信息,可以在PHP手册中的Error Control Operators页面上阅读我的评论。


是的抑制是有道理的。

例如,如果文件无法打开, fopen()命令将返回FALSE 。 这很好,但它也会产生一个PHP警告消息。 通常你不需要警告 - 你会自己检查FALSE

事实上,PHP手册特别建议在这种情况下使用@!

链接地址: http://www.djcxy.com/p/26603.html

上一篇: Suppress error with @ operator in PHP

下一篇: function() must be an instance of string, string given" prior to PHP 7?