我可以尝试/发现警告吗?

我需要捕捉一些来自一些PHP本地函数的警告,然后处理它们。

特别:

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

它在DNS查询失败时引发警告。

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

我现在有2个选项:

  • set_error_handler似乎是过度杀伤性的,因为我必须使用它来过滤页面中的每个警告(这是真的吗?

  • 调整错误报告/显示,以便这些警告不会回显到屏幕上,然后检查返回值; 如果它为false ,则不会为主机名找到记录。

  • 这里最好的做法是什么?


    设置和恢复错误处理程序

    一种可能性是在调用之前设置自己的错误处理程序,稍后使用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 -a
    Interactive shell
    
    php > echo @something(); // this will just silently die...
    

    没有更多的输出 - 祝你好运调试!

    bob@mypc:~$ php -a
    Interactive shell
    
    php > echo something(); // lets try it again but don't suppress the error
    PHP Fatal error:  Call to undefined function something() in php shell code on line 1
    PHP Stack trace:
    PHP   1. {main}() php shell code:0
    bob@mypc:~$ 
    

    这次我们可以看到它失败的原因。

    链接地址: http://www.djcxy.com/p/4515.html

    上一篇: Can I try/catch a warning?

    下一篇: How to get useful error messages in PHP?