【问题标题】:PHP escaping error reporting with @PHP使用@转义错误报告
【发布时间】:2010-12-02 06:48:16
【问题描述】:

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

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

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

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

为了清楚起见,这里使用的函数是原生 PHP fsockopen() 函数。

【问题讨论】:

标签: php debugging refactoring error-handling


【解决方案1】:

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

一旦应用大幅增长,这是一种将自己和队友拖入通宵寻找幽灵漏洞的好方法。

使用自定义异常处理的 Try-catch 是可行的方法。

【讨论】:

  • 有 1 个有效使用它们:如果您检查返回值并自己处理错误。
【解决方案2】:

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

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

【讨论】:

  • 像往常一样,这取决于它的使用地点和方式。
【解决方案3】:

这被称为error control operator,通常考虑使用它是一件非常可怕的事情。手册中的警告(胆子是我的):

目前的“@”错误控制 运算符前缀甚至会禁用 严重错误的错误报告 这将终止脚本执行。 除其他外,这意味着如果 您使用“@”来抑制来自 某些功能,或者不是 可用或输入错误, 脚本会死在那里没有 说明原因

【讨论】:

    【解决方案4】:

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

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

    你应该避免两件事:

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

    注意:您可能还想查看set_error_handler()

    【讨论】:

      【解决方案5】:

      如果您使用自定义错误处理程序,@ 运算符不会帮助您, 在处理代码中的“警告”的情况下,您总是会收到错误事件……例如在fsockopen 等处。

      所以你可以通过这种方式简单地有效地抑制警告:

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

      【讨论】:

        猜你喜欢
        • 2011-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-23
        • 2021-02-01
        • 1970-01-01
        • 2011-12-23
        • 2012-11-21
        相关资源
        最近更新 更多