作为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_WARNING
,E_ALL
和0
作为错误类型传递给set_error_handler
,但似乎设置了给定的错误处理程序键入删除所有其他类型的错误处理程序。那是对的吗?我可以通过为所有错误类型设置错误处理程序来解决这个问题。ErrorException
不是正确的事情 - 结果在完整的堆栈跟踪中,消息不会在Drupal监视程序日志中结束。相反,运行trigger_error
也不起作用 - 我可以看到触发器被调用(使用error_log
),但消息不会在监视程序日志中结束。使用Drupal 7.56和PHP 5.4。
答案 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
,因此我不会将此标记为已解决,以防有人知道如何解决该问题(并且理想情况下避免使用全局变量)。