我能试着/抓住警告吗?

我能试着/抓住警告吗?

我需要捕捉从某些php本机函数抛出的一些警告,然后处理它们。

具体而言:

array dns_get_record  ( string $hostname  [, int $type= DNS_ANY  [, array &$authns  [, array &$addtl  ]]] )

当DNS查询失败时,它将引发警告。

try/catch不起作用,因为警告也不例外。

我现在有两个选择:

  1. set_error_handler似乎有点过分,因为我必须使用它来过滤页面中的每一个警告(这是真的吗?)

  2. 调整错误报告/显示,使这些警告不会被回显到屏幕上,然后检查返回值;如果它是false,没有找到主机名的记录。

这里的最佳做法是什么?


叮当猫咪
浏览 264回答 3
3回答

Cats萌萌

设置和恢复错误处理程序一种可能是在调用之前设置自己的错误处理程序,然后用restore_error_handler().set_error_handler(function() { /* ignore errors */ });dns_get_record();restore_error_handler();您可以在此基础上构建并编写一个可重用的错误处理程序,为您记录错误。set_error_handler([$logger, 'onSilencedError']);dns_get_record();restore_error_handler();将错误转化为例外你可以用set_error_handler()而ErrorException类将所有php错误转换为异常。set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {     // error was suppressed with the @-operator     if (0 === error_reporting()) {         return false;     }     throw new ErrorException($errstr, 0, $errno, $errfile, $errline);});try {     dns_get_record();} catch (ErrorException $e) {     // ...}使用自己的错误处理程序时要注意的重要事项是,它将绕过error_reporting设置和传递所有错误(通知、警告等)给您的错误处理程序。您可以将第二个参数设置为set_error_handler()若要定义要接收的错误类型,或使用... = error_reporting()在错误处理程序中。抑制警告另一种可能是使用@运算符抑制调用,并检查dns_get_record()之后。但我建议你不要这样由于要处理的是错误/警告,而不是被抑制的错误/警告。

千万里不及你

真正有效的解决方案是将简单的错误处理程序设置为E_WARNING参数,如下所示:set_error_handler("warning_handler", E_WARNING);dns_get_record(...)restore_error_handler();function warning_handler($errno, $errstr) {  // do something}

吃鸡游戏

小心@操作者-它在消除警告的同时,也消除了致命的错误。我花了很多时间调试一个系统中的一个问题,在这个系统中,有人写了@mysql_query( '...' )问题是MySQL支持没有加载到PHP中,因此造成了一个无声的致命错误。对于那些作为PHP核心的一部分的东西来说是安全的,但是请小心使用。bob@mypc:~$ php -aInteractive shell php > echo @something(); // this will just silently die...没有进一步的输出-祝您好运调试这个!bob@mypc:~$ php -aInteractive shell php > echo something(); // lets try it again but don't suppress the errorPHP Fatal error:   Call to undefined function something() in php shell code on line 1PHP Stack trace:PHP   1. {main}() php shell code:0bob@mypc:~$这一次,我们可以看到它为什么失败了。
打开App,查看更多内容
随时随地看视频慕课网APP