如果PHP错误实际被@抑制,则检测(在自定义错误处理程序中)

时间:2011-09-14 19:30:11

标签: php error-handling

上下文:

我有三个应用程序环境:dev(本地),测试/登台(prod服务器),生产。该应用程序知道哪个是哪个。登台和生产的错误报告为0,因此永远不会显示错误。在dev上我希望立即看到错误,我希望看到它们发生的地方,所以不是在某些日志中,而是在代码的结果中。

但是,我不希望看到我使用@明确禁止的错误。我一直在使用fsockopen,当它无法连接时会发出警告。我接受无连接,但不想看到错误。甚至没有开发。

显然所有错误都通过自定义错误处理程序,即使它们在代码中被抑制。

我的错误处理程序只有4个参数:errno,error,file,line。从那些我无法看出错误是否最初被抑制。如果我能看到那里,我可以选择是否打印错误(现在我总是这样做,如果env = dev)。

有什么想法吗?或者可能关于如何完全忽略被抑制的错误(以便它们甚至不会到达自定义错误处理程序)?

2 个答案:

答案 0 :(得分:20)

set_error_handler手册页中有一个提示。

  如果导致错误的语句是

[error_reporting()]值将为0   由@ error-control运算符

预先添加

当您使用错误控制操作符@时,发生的是:

  1. 错误报告设置为0(无错误) - error_reporting(0)
  2. 评估表达式
  3. 错误报告将重新设置为之前的值(即重新打开)
  4. 上面稍微混淆的引用是指error_reporting返回当前设置的事实。如果您使用控制运算符抑制了错误,则调用error_reporting()将返回0.

    因此,如果您知道您已将其设置为非零(即您报告某些错误)并且它返回零,则您知道该错误已被抑制。

    如果您检测到已撤消的错误并想知道它是什么,您可以在变量$php_errormsg中找到它(如果track_errors设置为true php.ini )。

    请注意,错误控制操作符会导致大量开销,因为每次使用错误时都会更改错误报告级别两次。它会减慢你的脚本。

答案 1 :(得分:2)

处理php中错误的正确方法

  • 不要使用error_reporting
  • 安装错误到异常处理程序(http://www.php.net/manual/en/class.errorexception.php,示例1)并将所有php“错误”转换为异常
  • 在主代码中
  • ,在适当的地方使用try-catch
  • 安装exception handler以捕获未在主代码中捕获的异常。此处理程序是您输出和/或记录错误的唯一位置。
  • 请勿使用@。在极少数情况下,您要忽略错误,请使用空捕获块
  • 使用一些stupid trick来捕获“致命”错误。更好的是,contact php组并试图说服他们在脚本中处理“致命”错误。