这大约是DateTime::__construct
。根据这个comment:
如果无法解析时间,则抛出可以捕获的Exception类型的异常,但也会发出E_WARNING。如果要将警告转换为错误或关闭处理程序中的异常,则可能会造成混淆。
我可以避免警告吗?我有一个代码(我不在乎日期是否格式良好):
try {
$var = new DateTime('some invalid date format');
} catch (Exception $exception) {
$var = null;
}
但它仍然发送一个报告给我的错误捕获器的E_WARNING(我在Laravel应用程序中使用NewRelic)。而且我不希望报告此错误,因为它不是错误,我抓住了它。
如何避免DateTime::__construct
发出警告?
答案 0 :(得分:3)
这可能是少数几个可以使用的案例之一:
try {
$var = @new DateTime('some invalid date format');
} catch (Exception $e) {
$var = null;
}
但是,您可以通过执行以下操作来避开@
运算符:
try {
$oldErrorReporting = error_reporting();
error_reporting($oldErrorReporting & ~E_WARNING);
$var = new DateTime('some invalid date format');
error_reporting($oldErrorReporting);
} catch (Exception $e) {
$var = null;
}
答案 1 :(得分:2)
请改用date_create()
功能。
它(我假设)内部工作类似于您要避免的try/catch
块,如果日期无效则返回FALSE
。它不会触发任何错误或警告。
代码:
$var = date_create('some invalid date format');
或多或少与:
相同try {
$var = new DateTime('some invalid date format');
} catch (Exception $exception) {
$var = false;
}
答案 2 :(得分:1)
您应该创建一个错误处理程序,如下所示:
//set_error_handler();
set_error_handler(function($msg, $code, $severity, $file, $lineno, $errText) {
if (0 === error_reporting()) {
return false;
}
throw new ErrorException($msg, $code, $severity, $file, $lineno);
});
然后,
try {
$var = new DateTime('some invalid date format');
} catch (ErrorException $exception) {
$var = null;
}