【发布时间】:2020-12-03 16:46:17
【问题描述】:
我目前正在尝试了解 PHP 7 中新错误处理的行为。
在DivisionByZeroError 的 PHP 文档中,它指出:
DivisionByZeroError 当试图分割一个 数字为零。
很公平,但在使用 / 运算符时不会抛出 DivisionByZeroError。
在这个例子中,我希望两个错误都被捕获:
declare(strict_types=1);
function usesIntDiv(int $a, int $b) {
return intdiv($a,$b);
}
function divide(int $a, int $b) {
return $a / $b;
}
try {
echo usesIntDiv(2,0);
} catch (DivisionByZeroError $e) {
echo "Caught DivisionByZeroError!\n";
}
echo "\n";
try {
echo divide(2,0);
} catch (DivisionByZeroError $e) {
echo "Caught DivisionByZeroError!\n";
}
而是只捕获第一个:
发现除零错误!
PHP 警告:第 9 行的 TypeError.php 中除以零...
为什么?还有其他类似的情况吗?我的理解是,如果你捕捉到Throwable,你将捕捉到任何可以引发的东西,这将使 PHP 错误处理更易于管理。但是在这种情况下,如果我使用/ 运算符,它是无法捕获的PHP 警告。
这是特定于这个错误(可能是因为它是由操作员触发的),还是我误解了错误处理的变化?
【问题讨论】:
-
php 的一点澄清“以前,当 0 用作除数 (/) 或模数 (%) 运算符的除数时,将发出 E_WARNING 并返回 false . 现在,除法运算符返回一个浮点数,如 IEEE 754 所指定的 +INF、-INF 或 NAN。模运算符 E_WARNING 已被删除,并将引发 DivisionByZeroError 异常。"
-
文字语法给出警告,
intdiv()抛出异常。这绝对是不一致的,但在这一点上很难改变。更改为引发异常会破坏许多使用=== INF进行比较的现有代码(并关闭/忽略警告)。向后兼容性可能是造成这种不一致的原因。 -
感谢深思熟虑的 cmets 指出这种情况可能是为了向后兼容,所以如果它只是一次性的,那么至少 DivisionByZeroError 的 PHP 文档应该警告这种不一致。但它没有回答另一个问题,我认为如果你抓住 Throwable,你就会抓住一切,似乎并非如此。 PHP 错误处理的泥潭在 PHP 7 中进一步加深。
-
@Katie PHP 8 现在总是在除以零时抛出异常。
-
@bishop - 好消息 :)
标签: php error-handling php-7