上下文:
我有三个应用程序环境:dev(本地),测试/登台(prod服务器),生产。该应用程序知道哪个是哪个。登台和生产的错误报告为0,因此永远不会显示错误。在dev上我希望立即看到错误,我希望看到它们发生的地方,所以不是在某些日志中,而是在代码的结果中。
但是,我不希望看到我使用@
明确禁止的错误。我一直在使用fsockopen
,当它无法连接时会发出警告。我接受无连接,但不想看到错误。甚至没有开发。
显然所有错误都通过自定义错误处理程序,即使它们在代码中被抑制。
我的错误处理程序只有4个参数:errno,error,file,line。从那些我无法看出错误是否最初被抑制。如果我能看到那里,我可以选择是否打印错误(现在我总是这样做,如果env = dev)。
有什么想法吗?或者可能关于如何完全忽略被抑制的错误(以便它们甚至不会到达自定义错误处理程序)?
答案 0 :(得分:20)
set_error_handler
手册页中有一个提示。
如果导致错误的语句是[
预先添加error_reporting()
]值将为0 由@ error-control运算符
当您使用错误控制操作符@
时,发生的是:
error_reporting(0)
上面稍微混淆的引用是指error_reporting
返回当前设置的事实。如果您使用控制运算符抑制了错误,则调用error_reporting()
将返回0.
因此,如果您知道您已将其设置为非零(即您报告某些错误)并且它返回零,则您知道该错误已被抑制。
如果您检测到已撤消的错误并想知道它是什么,您可以在变量$php_errormsg
中找到它(如果track_errors
设置为true
php.ini
)。
请注意,错误控制操作符会导致大量开销,因为每次使用错误时都会更改错误报告级别两次。它会减慢你的脚本。
答案 1 :(得分:2)
error_reporting
@
。在极少数情况下,您要忽略错误,请使用空捕获块