如何仅忽略特定消息的警告?

时间:2017-07-25 12:29:10

标签: php drupal drupal-7

作为another issue的解决方法,我想为特定警告设置错误处理程序 。它应该检查警告是否以某个字符串开头,如果不是,它应该将警告交给原始处理程序。

到目前为止我得到了什么:

function filesize_for_url_ignoring_error_handler($severity, $message, $file, $line, $context) {
    if (strpos($message, 'Warning:  filesize(): stat failed for https://') === 0) {
        return;
    }
    restore_error_handler();
    throw new ErrorException($message, E_WARNING, $severity, $file, $line);
}

set_error_handler('filesize_for_url_ignoring_error_handler', E_WARNING);
$file = file_save($file);
restore_error_handler();

然而,似乎存在一些问题:

  • 我不能仅针对单个错误类型覆盖错误处理程序。我已经尝试将E_ERROR~E_WARNINGE_ALL0作为错误类型传递给set_error_handler,但似乎设置了给定的错误处理程序键入删除所有其他类型的错误处理程序。那是对的吗?我可以通过为所有错误类型设置错误处理程序来解决这个问题。
  • 我不知道如果与原始错误处理程序处理警告,如果它与预期的消息不匹配。投掷ErrorException不是正确的事情 - 结果在完整的堆栈跟踪中,消息不会在Drupal监视程序日志中结束。相反,运行trigger_error也不起作用 - 我可以看到触发器被调用(使用error_log),但消息不会在监视程序日志中结束。

使用Drupal 7.56和PHP 5.4。

1 个答案:

答案 0 :(得分:0)

通过编写自定义错误处理程序解决了90%,如果邮件不匹配,会调用原始错误处理程序:

function filesize_for_url_ignoring_error_handler($severity, $message, $file, $line, $context) {
    global $originalErrorHandler;
    if (strpos($message, 'filesize(): stat failed for https://') !== 0) {
        $originalErrorHandler($severity, $message, $file, $line, $context);
    }
}

class […] {
    public function […] {
        $originalErrorHandler = set_error_handler('filesize_for_url_ignoring_error_handler');
        $file = file_save($file);
        restore_error_handler();
    }
}

现在,只有不以" filesize():stat开头的消息才能通过https://"仍然登录file_save。唯一的问题是监视程序日志将消息显示为源自filesize_for_url_ignoring_error_handler,因此我不会将此标记为已解决,以防有人知道如何解决该问题(并且理想情况下避免使用全局变量)。