我能够尝试/捕捉警告吗?

我须要捕获一些从PHP本机函数抛出的警告,而后处理它们。 php

特别: apache

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

DNS查询失败时,它将引起警告。 函数

try / catch不起做用,由于警告也不例外。 spa

我如今有2个选择: rest

  1. set_error_handler彷佛有些set_error_handler由于我必须使用它来过滤页面中的每一个警告(这是真的吗?); 日志

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

这里的最佳作法是什么? dns


#1楼

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

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

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

#2楼

您可能应该尝试彻底消除警告,可是若是不可能,能够在呼叫以前添加@(即@dns_get_record(...)),而后使用能够获取的任何信息来肯定警告是否发生或不。 string


#3楼

设置和还原错误处理程序

一种多是在调用以前设置您本身的错误处理程序,并稍后使用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()访问当前设置。

禁止警告

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


#4楼

若是dns_get_record()失败,它将返回FALSE ,所以您可使用@禁止显示警告,而后检查返回值。


#5楼

我想尝试/捕获警告,但同时保留一般的警告/错误日志记录(例如,在/var/log/apache2/error.log ); 处理程序必须为此返回false 。 可是,因为“ throw new ...”语句基本上会中断执行,所以必须执行“ wrap in function”技巧,该技巧也在如下内容中进行了讨论:

是否有静态方法在php中引起异常

或者,简而言之:

function throwErrorException($errstr = null,$code = null, $errno = null, $errfile = null, $errline = null) {
    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
  }
  function warning_handler($errno, $errstr, $errfile, $errline, array $errcontext) {
    return false && throwErrorException($errstr, 0, $errno, $errfile, $errline);
    # error_log("AAA"); # will never run after throw
    /* Do execute PHP internal error handler */
    # return false; # will never run after throw
  }
  ...
  set_error_handler('warning_handler', E_WARNING);
  ...
  try {
    mkdir($path, 0777, true);
  } catch (Exception $e) {
    echo $e->getMessage();
    // ...
  }

编辑:仔细检查后,发现它不起做用:“ return false && throwErrorException ... ”基本上将不会引起异常,而只是登陆错误日志; 删除“ false && ”部分(如“ return throwErrorException ... ”中的部分),将使异常抛出工做正常进行,但随后将不登陆error_log ...不过,我仍会保留此消息,由于我尚未这样作没有看到其余地方记录的这种行为。

相关文章
相关标签/搜索