java怎么抛出警告信息_我可以尝试/捕捉警告吗?

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

特别:

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

DNS查询失败时,它将引发警告。

try / catch不起作用,因为警告也不例外。

我现在有2个选择:

set_error_handler似乎有些set_error_handler因为我必须使用它来过滤页面中的每个警告(这是真的吗?);

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

这里的最佳做法是什么?

#1楼

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

set_error_handler("warning_handler", E_WARNING);

dns_get_record(...)

restore_error_handler();

function warning_handler($errno, $errstr) {

// do something

}

#2楼

您可能应该尝试完全消除警告,但是如果不可能,可以在呼叫之前添加@(即@dns_get_record(...)),然后使用可以获取的任何信息来确定警告是否发生或不。

#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”技巧,该技巧也在以下内容中进行了讨论:

或者,简而言之:

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 ...不过,我仍会保留此消息,因为我还没有这样做没有看到其他地方记录的这种行为。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值