为什么在PHP中使用@function(禁用每个函数的错误报告)是不好的做法?

时间:2013-07-30 00:30:27

标签: php function error-handling

在PHP中,我们可以通过在函数开头使用@来禁用特定函数的错误报告:

Error Control Operators

  

PHP支持一个错误控制操作符:at符号(@)。什么时候   预先附加到PHP中的表达式,可能是任何错误消息   该表达式生成的内容将被忽略。

例如:

@mail(...)

如果有错误,将不会返回任何错误,是一种不好的做法?为什么?

4 个答案:

答案 0 :(得分:5)

是的,这是不好的做法。这主要是因为它允许懒惰的代码编写,当你应该出现并纠正你得到的错误而不是仅仅抑制它们,然后当你的代码不起作用并且你无法弄清楚为什么时会感到惊讶。

答案 1 :(得分:2)

构建程序的方式应该处理错误,而不是隐藏错误。如果某个函数可能会产生错误,那么您应该编写代码来处理它。这是一个例子。

假设我有一个名为$ myarray的数组,我想循环遍历它:

foreach($myarray as $value) {
    print $value;
}

如果$ myarray的存在是有条件的(也许它是从数据库中提取的数据创建的),则foreach()循环将失败,因为$ myarray不是变量。为了处理这种情况,我可以像这样编写上面的循环:

if(isset($myarray) && is_array($myarray)) {
    foreach($myarray as $value) {
        print $value;
    }
}

这将在尝试执行循环之前验证数组是否实际存在。这样,foreach()就不会因为这个原因而抛出错误,而且我不必压制任何错误。

在设计代码时应避免潜在的错误。应捕获不可避免的错误,以便向用户显示有用的非极客消息,以便他们知道如何响应错误。或者更好的是,如果程序可以绕过错误并完成任务并且安静地执行任务,那么应该这样做。

在mail()的情况下,如果它会抛出错误,为什么会这样做呢?您是否应该为其创建意外事件,例如另一种发送电子邮件的方法,或将其排队等待以后交付,还是其他一些选项?你不想压制错误,你想要处理它。

答案 2 :(得分:1)

是的,这是一种不好的做法。例如,用户想要在您的网站上注册,您将向他发送激活链接或邮件中的重要内容。您正在使用@mail,但由于内部错误(邮件服务器关闭)或类似情况,无法发送邮件。用户是否知道电子邮件未被发送?不,因为您使用@抑制了错误,或者没有处理错误并通知用户。

答案 3 :(得分:0)

使用PHP错误控制操作符@有一些原因是错误的:

1- PHP手册

  

目前,“@”错误控制运营商前缀甚至会禁用   错误报告将终止脚本的严重错误   执行。除此之外,这意味着如果你使用“@”来   抑制某个功能的错误,并且它不可用   或者错误输入,脚本将在那里死亡   指示为什么。

2-如果您使用@,则可能仍然使用不推荐使用的功能:

if(eregi("a", "abc")) echo "a";

产生此错误:

 Deprecated: Function eregi() is deprecated in D:\htdocs\test.php on line 2

使用if(@eregi("a", "abc")) echo "a";时不会发出任何消息。

3-其他事实:

http://us3.php.net/manual/en/language.operators.errorcontrol.php#99805

  

请注意,使用@是慢狗,因为PHP会产生开销   以这种方式抑制错误。这是速度和速度之间的权衡   便利性。

http://us3.php.net/manual/en/language.operators.errorcontrol.php#85042

  
      
  • 调用设置的错误处理程序,无论设置错误报告的级别如何,或者语句是否已启用   与@

  •   
  • 由错误处理程序决定在不同的错误级别上赋予一些含义。您可以使自定义错误处理程序回显   所有错误,即使错误报告设置为NONE。

  •   
  • 那么@运营商会做什么?它会临时将该行的错误报告级别设置为0。如果该行触发错误,   错误处理程序仍将被调用,但它将被调用   错误级别为0

  •   

http://us3.php.net/manual/en/language.operators.errorcontrol.php#94004

  

请注意之前在语句中使用错误控制运算符   include()像这样:

     

<?PHP (@include("file.php")) OR die("Could not find file.php!"); ?>

     

这个原因,错误报告级别也被设置为零   包含文件。因此,如果包含的文件中存在一些错误,则会出现错误   将不会显示。

最后,可以集中管理所有应用程序的错误处理,而不仅仅是针对特定功能。