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

具体地说:

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

当DNS查询失败时,它抛出一个警告。

Try /catch不起作用,因为警告不是异常。

我现在有两个选择:

set_error_handler似乎是多余的,因为我必须使用它来过滤页面中的每个警告(这是真的吗?); 调整错误报告/显示,这样这些警告就不会显示在屏幕上,然后检查返回值;如果为假,则没有找到主机名的记录。

这里的最佳实践是什么?


当前回答

从PHP7开始,你可以像这样捕捉大多数错误和警告:

try {
    whatever();
} catch (Throwable $e) {
}

更多:https://www.php.net/manual/en/language.errors.php7.php

其他回答

尝试检查它是否返回一些布尔值,然后你可以简单地把它作为一个条件。我遇到这与oci_execute(…)返回一些违反我的唯一键。

ex.
oci_parse($res, "[oracle pl/sql]");
if(oci_execute){
...do something
}

我只建议在直接操作时使用@来抑制警告(例如$prop = @($high/($width - $depth));跳过0警告的除法)。然而,在大多数情况下,这是更好的处理。

真正有效的解决方案是使用E_WARNING参数设置简单的错误处理程序,如下所示:

set_error_handler("warning_handler", E_WARNING);
dns_get_record(...)
restore_error_handler();

function warning_handler($errno, $errstr) { 
// do something
}

从PHP7开始,你可以像这样捕捉大多数错误和警告:

try {
    whatever();
} catch (Throwable $e) {
}

更多:https://www.php.net/manual/en/language.errors.php7.php

通常你不应该使用@,除非这是唯一的解决方案。在这种情况下,应该首先使用dns_check_record函数来了解该记录是否存在。