代码之家  ›  专栏  ›  技术社区  ›  Evernoob

PHP转义错误报告@

  •  2
  • Evernoob  · 技术社区  · 16 年前

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

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

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

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

    为了清楚起见,这个函数使用的是本机PHP fsockopen() 功能。

    5 回复  |  直到 11 年前
        1
  •  5
  •   code_burgar    16 年前

    这可能是您在PHP代码中遇到的最糟糕的做法之一。它基本上告诉解释器抑制错误,不管结果如何,只要尝试做代码要求它做的任何事情。

    一个很好的方法,把自己和队友拖到彻夜的幽灵虫猎杀一旦应用程序已经大幅增长。

    使用自定义异常处理尝试catch是一种方法。

        2
  •  4
  •   Tom Haigh    16 年前

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

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

        3
  •  3
  •   karim79    16 年前

    这就是所谓的 error control operator ,通常是一个非常可怕的事情考虑使用。手册中的警告(胆量是我的):

    当前的“@”错误控件 运算符前缀 甚至会禁用 关键错误的错误报告 将终止脚本执行 . 除此之外,这意味着如果 使用“@”可禁止来自 某种功能,或者不是 可用或输入错误, 脚本 会死在那里没有 说明原因 .

        4
  •  3
  •   Felix    16 年前

    使用“@”运算符在 知道 函数调用可能失败,例如 fsockopen 打电话。最佳实践是仅当您调用的函数经常失败并且在应用程序中是有效的情况时才使用它。另外,在调用函数后,必须检查函数的返回值:

    $fp = @fsockopen($hostname, $port);
    if ($fp === false) {
        // handle connection failure
    }
    else {
        // handle connection success
    }
    

    你应该避免两件事:

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

    注: 你可能还想看看 set_error_handler()

        5
  •  0
  •   Grain    11 年前

    如果使用自定义错误处理程序,@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;
    }