【问题标题】:Detect (in custom error handler) if a PHP error was actually suppressed by @检测(在自定义错误处理程序中)PHP 错误是否被 @ 实际抑制
【发布时间】:2011-11-17 07:48:59
【问题描述】:

上下文:

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

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

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

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

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

【问题讨论】:

  • 从技术上讲,我显然是在谈论通知和警告而不是错误,因为错误是致命的(除了可恢复的致命错误,不管它们是什么)。
  • 我将如何使用异常? PHP 选择是否抛出错误或异常(或警告或通知等)。 (我没有使用自定义错误处理程序来制造所有 php 错误 -> 异常。)我希望 PHP 只使用异常......
  • @stereofrog 到什么目的?我仍然必须在错误处理程序中捕获被抑制的错误,而不是一直抛出异常......我不明白这一点。效率也不高。

标签: php error-handling


【解决方案1】:

set_error_handler 手册页中对此有提示。

[error_reporting()] 如果导致错误的语句是 由 @error-control 运算符前置

当您使用错误控制运算符@ 时,发生的情况是这样的:

  1. 错误报告设置为 0(无错误)-error_reporting(0)
  2. 计算表达式
  3. 错误报告设置回之前的值(即重新打开)

上面略带混淆的引用是指error_reporting 返回当前设置的事实。如果您使用控制运算符抑制了错误,则调用 error_reporting() 将返回 0。

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

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

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

【讨论】:

  • 我正要发布类似的东西,但你抢先了。 :) @Rudie:另见php.net/manual/en/language.operators.errorcontrol.php#98895
  • 真棒 =) 我没想到会这么简单。确实很好的解释。
  • 很高兴你喜欢它。祝你好运。
  • @adam:正在查看您的个人资料并点击此帖子!我很期待那个答案!好!
【解决方案2】:

处理php错误的正确方法

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

【讨论】:

  • LOL 删除致命错误?你知道为什么致命错误是致命的吗?因为它们是不可恢复的...如果您没有捕获 ErrorException,则各种错误/警告/通知都是致命的...您希望在应用程序中的某个地方有一个小通知来停止整个流程并最终进入全局试着抓?这似乎没有必要。我不相信。我喜欢警告和通知。错误应该是例外。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 2017-12-18
相关资源
最近更新 更多