php - 检测(在自定义错误处理程序中)PHP 错误是否实际上被 @ 抑制了

标签 php error-handling

上下文:

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

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

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

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

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

最佳答案

set_error_handler 中对此有提示手册页。

[the error_reporting()] value will be 0 if the statement that caused the error was prepended by the @ error-control operator

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

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

上面那句有点令人困惑的引述是指 error_reporting 返回当前设置这一事实。如果您已使用控制运算符抑制错误,则调用 error_reporting() 将返回 0。

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

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

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

关于php - 检测(在自定义错误处理程序中)PHP 错误是否实际上被 @ 抑制了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421908/

相关文章:

php - 过滤日期order_date在其日期范围sql问题

javascript - 无法获取Ajax调用的返回

php - SQLite/PHP 只读?

c - Scanf() 无法检测到错误的输入

error-handling - 我的网站页面上的500 Internal Server Error

php - php restore_error_handler无法正常工作

php - 如何在wordpress中获取img标签的图片url

php - 上一页 1 2 3 4 5 下一页 5 仅页码

asp.net-mvc - ASP MVC 中的自定义错误处理

r - 在循环中使用geterrmessage()-R