一尘不染

我可以尝试/捕捉警告吗?

php

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

特别:

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

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

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

我现在有2个选择:

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

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

这里的最佳做法是什么?


阅读 237

收藏
2020-05-26

共1个答案

一尘不染

设置和还原错误处理程序

一种可能是在调用之前设置您自己的错误处理程序,并稍后使用还原以前的错误处理程序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, $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()错误处理程序内部访问当前设置。

禁止警告

另一种可能性是使用@运算符禁止调用,然后检查after的返回值dns_get_record()但是我建议不要这样做,
因为错误/警告会被触发而不是被抑制。

2020-05-26