PHP转义错误报告与@

PHP转义错误报告与@,php,debugging,refactoring,error-handling,Php,Debugging,Refactoring,Error Handling,我目前正在为工作重构一些代码,遇到了一些以“@”符号为前缀的函数调用。据我所知,这是为了在调用失败时避免PHP错误报告 这类事情是好的做法吗?我理解开发环境中的基本原理,但是当站点被推到生产环境中时,是否应该正确处理所有错误,而不是仅仅逃避 因此,使用此符号意味着开发人员必须在稍后阶段对代码进行排序,以删除所有错误报告转义 我不确定是否要删除这些符号,并找到更好的方法来处理潜在的错误 为清楚起见,在其上使用的函数是本机PHPfsockopen()函数。这可能是PHP代码中遇到的最糟糕的实践之一。

我目前正在为工作重构一些代码,遇到了一些以“@”符号为前缀的函数调用。据我所知,这是为了在调用失败时避免PHP错误报告

这类事情是好的做法吗?我理解开发环境中的基本原理,但是当站点被推到生产环境中时,是否应该正确处理所有错误,而不是仅仅逃避

因此,使用此符号意味着开发人员必须在稍后阶段对代码进行排序,以删除所有错误报告转义

我不确定是否要删除这些符号,并找到更好的方法来处理潜在的错误


为清楚起见,在其上使用的函数是本机PHP
fsockopen()
函数。

这可能是PHP代码中遇到的最糟糕的实践之一。它基本上告诉解释器抑制错误,并尝试执行代码要求它执行的任何操作,而不管结果如何

这是一个很好的方法,可以在应用程序大幅增长后,将你自己和队友拖入彻夜的幻影bug搜索中

<>试着用自定义的异常处理方法去做。

这被称为,并且通常是一个非常可怕的考虑使用的东西。手册中的警告(鼓励我的是):

当前为“@”错误控制 操作员前缀甚至会禁用 关键错误的错误报告 将终止脚本执行的。 除其他外,这意味着如果 您可以使用“@”来抑制来自 某些功能,或者不是 可用或输入错误,则 脚本将在那里死掉,没有 说明原因


我认为有时使用@调用fsockopen()之类的函数是可以理解的,因为当它们失败时,会发出警告并返回false

在某些情况下,您可能希望这些呼叫定期失败,因此不希望发出警告。显然,您不应该在生产中显示警告,而应该记录它们,但是您可能仍然希望使用@operator来阻止日志变满。您可以通过更改错误报告设置来停止报告警告,但这并不理想。

当您知道函数调用可能失败时,使用“@”操作符非常有用,例如,
fsockopen
调用。最佳实践是,仅当您调用的函数经常失败并且在应用程序中是有效的情况时,才使用此选项。另外,在调用函数后,一定要检查函数的返回值:

$fp = @fsockopen($hostname, $port);
if ($fp === false) {
    // handle connection failure
}
else {
    // handle connection success
}
你应该避免两件事:

  • 不检查返回值
  • 在不希望出现错误的情况下使用“@”运算符—例如,在打开本地文件或发送头时。当打开本地文件失败时,这是一个错误,应该正确处理

  • 注意:如果您使用自定义错误处理程序,@operator将不会帮助您, 当您处理代码中的“警告”时,您总是会收到错误事件。。。例如在
    fsockopen
    等处

    因此,可以通过以下方式简单有效地抑制警告:

    function renameWithOutExpectedAndSelfHandledErrors( ... ) {
    
      set_error_handler(function(){}); // deactivate all errors
      $result = rename('not existing','blafussel');
      restore_error_handler(); // restore old error-situation
    
      return $result;
    }
    

    请看这里:有1个有效的使用它们:如果你检查返回值并自己处理错误。通常这取决于它的使用位置和方式。