PHP Conference Japan 2024

DivisionByZeroError

(PHP 7, PHP 8)

简介

当尝试将数字除以零时,将抛出 DivisionByZeroError

类概要

class DivisionByZeroError extends ArithmeticError {
/* 继承的属性 */
protected string $message = "";
private string $string = "";
protected int $code;
protected string $file = "";
protected int $line;
private array $trace = [];
private ?Throwable $previous = null;
/* 继承的方法 */
public Error::__construct(string $message = "", int $code = 0, ?Throwable $previous = null)
final public Error::getMessage(): string
final public Error::getCode(): int
final public Error::getFile(): string
final public Error::getLine(): int
final public Error::getTrace(): array
private Error::__clone(): void
}
添加备注

用户贡献的注释 3 条注释

13
8ctopus
4 年前
在 php 7 中使用算术运算符 / 不会抛出异常,而在 php 8 中则会抛出异常。

<?php

try {
echo
intdiv(2, 0);
} catch (
DivisionByZeroError $e) {
echo
"Caught DivisionByZeroError!\n";
}

try {
echo (
2 / 0);
} catch (
DivisionByZeroError $e) {
echo
"Caught DivisionByZeroError!\n";
}
?>

# php 7
$ php test.php
捕获 intdiv() 的除零错误
PHP Warning: test.php 第 10 行中出现除零错误
PHP 堆栈跟踪
PHP 1. {main}() test.php:0

Warning: test.php 第 10 行中出现除零错误

调用堆栈
0.0740 417272 1. {main}() test.php:0

# php 8
$ php test.php

捕获 intdiv() 的除零错误
捕获 / 的除零错误
7
salsi at icosaedro dot it
8 年前
请注意,在除以零 1/0 和模数除以零 1%0 时,首先会触发 E_WARNING(可能是为了与 PHP5 向后兼容),然后接下来会抛出 DivisionByZeroError 异常。

例如,结果是,如果您使用 error_level(-1) 设置最大错误检测级别,并且您还将错误映射到异常,例如 ErrorException,那么在除以零时,只有后者异常被抛出,报告“除以零”。结果是像这样的代码

<?php
// 设置安全环境:
error_reporting(-1);

// 将错误映射到 ErrorException。
function my_error_handler($errno, $message)
{ throw new
ErrorException($message); }

try {
echo
1/0;
}
catch(
ErrorException $e){
echo
"got $e";
}
?>

允许在 PHP5 和 PHP7 下以相同的方式检测此类错误,尽管 ErrorException 掩盖了 DivisionByZeroError 异常。
-1
Alex
5 年前
此错误仅在整数除法中抛出 - 这是使用“intdiv”函数或“%”运算符时。在所有情况下,除以零时您都会收到 E_WARNING。
To Top