当前位置: 首页 > 面试题库 >

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

甘明朗
2023-03-14
问题内容

我需要捕捉一些从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,则找不到主机名的记录。

这里的最佳做法是什么?


问题答案:

设置和还原错误处理程序

一种可能是在调用之前设置您自己的错误处理程序,并稍后使用还原以前的错误处理程序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()但是我建议不要这样做,
因为错误/警告会被触发而不是被抑制。



 类似资料:
  • 我的项目由一个小图标组成,它在一个尺寸为25×20的网格上移动。我知道我可以用几个if/else块轻松地完成这项工作,但我想了解更多关于错误处理的知识。 我当时想的是使用try-catch,但它根本不会捕获数组索引越界异常或任何:它不会返回“error”或位置,因此它永远不会进入catch块。 我在想这样的伪代码: 实际代码:

  • 我在使用这个try/catk语句时遇到了麻烦。我试图用它抛出一条错误消息,上面写着,“请输入一个整数!”如果用户输入一个字母。我使用的第一个成功了,但是它最终需要两行用户输入,而不仅仅是一行,所以它基本上跳过了一个应该问的问题。在那之后,其他的都不起作用,它们只是被完全跳过。我还需要对用户输入做同样的事情,如果用户在字母应该在的地方输入整数,它会抛出一条错误消息,上面写着“请输入字符串!”。我知道

  • 问题内容: 我正在使用Python,每当必须验证函数输入时,我都认为输入有效,然后捕获了错误。 就我而言,我有一个通用类,用于一些不同的事情,其中​​之一是加法。它既作为类又作为a起作用,因此当我向标量添加标量时,应将该常数添加到每个单独的组件中。和加法需要按组件进行加法。 这段代码被用于光线追踪器,因此任何速度提升都很棒。 这是我班的简化版: 我目前正在使用该方法。有人知道更快的方法吗? 编辑:

  • 我正在研究一个POC,用于在我的项目中实现Kafka集群。我已经设置了一个Kafka集群在我的本地机器与3经纪人。现在,我使用Spring MVC REST服务向Kafka服务器发送消息,该服务在内部使用Spring Kafka生成和使用往返于Kafka集群的消息。现在,我试图发送警报时,消费者无法接收消息从主题时,经纪人是下降。我关闭消费者连接到的唯一代理。我没有得到任何异常在我的日志,但我得到

  • 我在do while loop中尝试执行try-catch语句时遇到了一个问题,我要求用户首先输入字母,然后输入一个数字,如果他输入正确,程序结束;如果他输入字母而不是数字,程序应该说“发生错误,请输入数字”,并要求用户再次输入数字,但每次我输入字母而不是数字,程序就进入了一个无限循环,不允许我输入新的值。只是说“发生错误,您必须输入数字”“请输入数字”。

  • 我的sp中有一个try catch块,try中只有一个insert语句。捕捉检查错误代码,如果是pk违规,如果是则做更新。但是有时我会得到“当前事务不能被提交,不能支持写入日志文件的操作。回滚事务。 在批处理结束时检测到不可提交的事务。事务被回滚了“,所以我添加了xact_abort,但后来我不断得到”EXECUTE之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配“,我发现了这一