[英]PHP escaping error reporting with @
我正在重构一些工作代码,我遇到了一些以“@”符号为前缀的函数调用。 据我了解,如果调用失败,这是为了逃避PHP错误报告。
这种类型的东西是好的做法吗? 我理解开发环境中的基本原理,但是当网站被推向生产时,不应该正确处理所有错误而不是仅仅进行转义?
因此,使用此符号意味着开发人员必须在稍后阶段对代码进行排序,以删除所有错误报告转义。
我不确定是否删除这些符号,只是找到一种更好的方法来处理潜在的错误。
为清楚起见,使用它的函数是本机PHP fsockopen()
函数。
这可能是你在PHP代码中遇到的最糟糕的做法。 它基本上告诉解释器抑制错误,并尝试做任何代码要求它做的事情,无论结果如何。
一旦应用程序大幅增长,一个很好的方法可以将自己和其他队友拖入全能的幻影中。
使用自定义异常处理的try-catch是可行的方法。
我认为使用@来调用函数如fsockopen()有时是可以理解的,因为当它们失败时它们会引发警告并返回false。
在某些情况下,您可能希望这些调用定期失败,因此不希望发出警告。 显然,您不应该在生产中显示警告,而应该记录它们,但您可能仍希望使用@运算符来阻止日志变满。 您可以通过更改error_reporting设置来停止报告,但这并不理想。
这被称为错误控制操作符 ,通常是一个非常可怕的事情要考虑使用。 手册中的警告(我的是大胆的):
目前,“@”错误控制运算符前缀甚至会禁用 将终止脚本执行的 严重错误的错误报告 。 除此之外,这意味着如果你使用“@”来抑制来自某个函数的错误,并且它不可用或者输入错误,那么脚本就会在那里死亡而没有任何 关于原因的指示 。
当您知道函数调用可能失败时,使用“@”运算符非常有用,例如, fsockopen
调用。 最佳做法是仅在您调用的函数失败并且在您的应用程序中是有效的情况时才使用它。 此外,您应该在调用后检查函数的返回值:
$fp = @fsockopen($hostname, $port);
if ($fp === false) {
// handle connection failure
}
else {
// handle connection success
}
你应该避免两件事:
注意:您可能还想查看set_error_handler()
如果您使用自定义错误处理程序,@运算符将无法帮助您,您将始终从处理代码中的“警告”的情况中获得错误事件...例如在fsockopen
等。
所以你可以这样简单地有效地抑制警告:
function renameWithOutExpectedAndSelfHandledErrors( ... ) {
set_error_handler(function(){}); // deactivate all errors
$result = rename('not existing','blafussel');
restore_error_handler(); // restore old error-situation
return $result;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.