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 = "";
受保護的 整數 $line;
私有的 陣列 $trace = [];
私有的 ?Throwable $previous = null;
/* 繼承的方法 */
公開的 Error::__construct(字串 $message = "", 整數 $code = 0, ?Throwable $previous = null)
最終 公開的 Error::getMessage(): 字串
最終 公開的 Error::getPrevious(): ?Throwable
最終 公開的 Error::getCode(): 整數
最終 公開的 Error::getFile(): 字串
最終 公開的 Error::getLine(): 整數
最終 公開的 Error::getTrace(): 陣列
最終 公開的 Error::getTraceAsString(): 字串
私有的 Error::__clone():
}
新增註記

使用者貢獻的註記 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 警告:test.php 第 10 行發生除以零的錯誤
PHP 堆疊追蹤
PHP 1. {main}() test.php:0

警告: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 下以相同的方式偵測此類錯誤,儘管 DivisionByZeroError 例外被 ErrorException 遮蔽。
-1
Alex
5 年前
此錯誤僅在整數除法時拋出 — 也就是使用 "intdiv" 函式或 "%" 運算子時。在所有除以零的情況下,您都會收到 E_WARNING 警告。
To Top