(PHP 7, PHP
Introduction
DivisionByZeroError is thrown
when an attempt is made to divide a number by zero.
Class synopsis
protected
string
$file = «»;
private
array
$trace = [];
}
8ctopus ¶
2 years ago
Use of arithmetic operator / does not throw an exception in php 7, while it does in php 8.
<?phptry {
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
caught division by zero for intdiv()
PHP Warning: Division by zero in test.php on line 10
PHP Stack trace:
PHP 1. {main}() test.php:0
Warning: Division by zero in test.php on line 10
Call Stack:
0.0740 417272 1. {main}() test.php:0
# php 8
$ php test.php
caught division by zero for intdiv()
caught division by zero for /
salsi at icosaedro dot it ¶
7 years ago
Note that on division by zero 1/0 and module by zero 1%0 an E_WARNING is triggered first (probably for backward compatibility with PHP5), then the DivisionByZeroError exception is thrown next.
The result is, for example, that if you set the maximum level of error detection with error_level(-1) and you also map errors to exception, say ErrorException, then on division by zero only this latter exception is thrown reporting "Division by zero". The result is that a code like this:
<?php
// Set a safe environment:
error_reporting(-1);// Maps errors to ErrorException.
function my_error_handler($errno, $message)
{ throw new ErrorException($message); }
try {
echo
1/0;
}
catch(ErrorException $e){
echo "got $e";
}
?>
allows to detect such error in the same way under PHP5 and PHP7, although the DivisionByZeroError exception is masked off by ErrorException.
Alex ¶
4 years ago
This error is thrown only for integer division - this is when using "intdiv" function or "%" operator. In all cases you will get an E_WARNING when dividing by zero.
Manjunath ¶
7 years ago
<?php
class MathOperation extends Error
{
protected $n = 10;// Try to get the Division by Zero error object and display as Exception
public function doArithmeticOperation(): string
{
try {
$value = $this->n % 0;
} catch (DivisionByZeroError $e) {
return $e->getMessage();
}
}
}$mathOperationObj = new MathOperation();
echo $mathOperationObj->doArithmeticOperation();
I realize this is an old question, but it is relevant today and I don’t really like the answers here.
The proper way to fix this, is by actually evaluating the expression yourself — that is, by parsing the expression, then evaluating it step by step, instead of by transpiling it to PHP. This can be done using the https://en.wikipedia.org/wiki/Shunting-yard_algorithm.
I wrote the following implementation, but I haven’t tested it. It’s based on the above Wikipedia article. There is no support for right-associative operators, so it’s slightly simplified.
// You may need to do a better parsing than this to tokenize your expression.
// In PHP, you could for example use token_get_all()
$formula = explode(' ', 'foo + bar * ( baz / ( foz - bak ) )');;
$queue = array();
$operators = array();
$precedence = array('-' => 2, '+' => 2, '/' => 3, '*' => 3, '^' => 4);
$rightAssoc = array('^');
$variables = array('foo' => $foo, 'bar' => $bar, 'baz' => $baz, 'foz' => $foz, 'bak' => $bak);
foreach($formula as $token) {
if(isset($variables[$token])) {
$queue[] = $variables[$token];
} else if(isset($precedence[$token])) {
// This is an operator
while(
sizeof($operators) > 0 &&
$operators[sizeof($operators)-1] != '(' && (
$precedence[$operators[sizeof($operators)-1]] > $precedence[$token] ||
(
$precedence[$operators[sizeof($operators)-1]] == $precedence[$token] &&
!in_array($operators[sizeof($operators)-1], $rightAssoc)
)
)
) $queue[] = array_pop($operators);
$operators[] = $token;
} else if($token == '(') {
$operators[] = '(';
} else if($token == ')') {
while($operators[sizeof($operators)-1] != '(') {
$queue[] = array_pop($operators);
}
array_pop($operators);
} else if($token == ')') {
while($operators[sizeof($operators)-1] != ')') {
$queue[] = array_pop($operators);
}
if(null === array_pop($operators))
throw new Exception("Mismatched parentheses");
}
$queue = array_merge($queue, array_reverse($operators));
$stack = array();
foreach($queue as $token) {
if(is_numeric($token)) $stack[] = $token;
else switch($token) {
case '+' :
$stack[] = array_pop($stack) + array_pop($stack);
break;
case '-' :
// Popped variables come in reverse, so...
$stack[] = -array_pop($stack) + array_pop($stack);
break;
case '*' :
$stack[] = array_pop($stack) * array_pop($stack);
break;
case '/' :
$b = array_pop($stack);
$a = array_pop($stack);
if($b == 0)
throw new Exception("Division by zero");
$stack[] = $a / $b;
break;
}
}
echo "The result from the calculation is ".array_pop($stack)."n";
In your particular case
Even though I would prefer the Shunting Yard solution — if I still decided to go for an eval()-version, I would create a custom_division($leftHandSide, $rightHandSide) method, that throws an exception. This code:
eval("$foo + $bar * ( $baz / ( $foz - $bak ) )");
becomes
function custom_division($a, $b) { if($b == 0) throw Exception("Div by 0"); }
eval("$foo + $bar * ( custom_division( $baz, ( $foz - $bak ) )");
Ошибка — Warning: Division by zero in, как исправить
09.12.2020
Марат
63
0
php | php_error |
Ошибка Division by zero, как исправить ошибку Warning: Division by zero in
division by zero это не ошибка при установке игры — это обычное деление на ноль…
- Что означает ошибка Division by zero
- Как исправить ошибку Warning: Division by zero in
Что означает ошибка Division by zero
У нас встретилась вот такая ошибка :
Warning: Division by zero in адрес on line 18
Прежде чем приступать к нашей ошибке — давайте просто попробуем перевести!
Warning: Division by zero — перевод
Переведем данную ошибку с английского и нам сразу станет все ясно!
Warning — предупреждение, сигнал сущ
Division — деление, отдел, раздел, распределение сущ
by — по, посредством предл
zero — ноль сущ
Итого, если мы соберем данную фразу «Warning: Division by zero» на русском, то получим :
Внимание! Ошибка деления на ноль!
как исправить ошибку Warning: Division by zero in
Дл ятого, чтобы исправить ошибку «Warning: Division by zero in» нам понадобится скриншот ошибки, который мы приводили раньше. смотрим на него и видим последнее слово и число, line — это линия в файле, 18 — это номер линии где ошибка.
line 18
И та часть, которая размыта — это адрес, по которому находится файл с ошибкой Warning: Division by zero in
Далее находим данный файл и удаляем ошибку!
Не благодарите, но ссылкой можете поделиться!
COMMENTS+
BBcode
Обработка исключений
Конструкция try catch finally
Последнее обновление: 24.03.2021
В процессе работы программы могут возникать различные ошибки, которые могут прервать работу программы. Например, рассмотрим следующую ситуацию:
$a = 5; $b = 0; $result = $a / $b; echo $result; echo "Конец работы программы";
Программа выводит результат деления. Поскольку делитель равен 0, а на ноль делить нельзя, то при выполнении деления программа завершится, и в браузере мы увидим
что-то типа следующего:
Fatal error: Uncaught DivisionByZeroError: Division by zero in D:localhosthello.php:11 Stack trace: #0 {main} thrown in D:localhosthello.php on line 11
Браузер отобразит нам произошедшую ошибку, причем дальше после строки с делением программа даже не будет выполняться.
Кто-то может сказать, что ситуация искуственная, так как мы сами определили делитель равный нулю. Но данные могут передаваться извне. Кроме того, кроме деления на ноль есть различные
ситуации, при которых могут происходить ошибки. Но PHP предоставляет ряд возможностей для обработки подобных ситуаций.
Для обработки исключений в PHP применяется конструкция try-catch:
try { // код, который может вызвать исключение } catch(Тип_исключения $ex) { // обработка исключения }
Эта конструкция в общем варианте состоит из двух блоков — try
и catch
. В блок try
помещается код, который потенциально может вызвать исключение.
А в блоке catch
помещается обработка возникшего исключения. Причем каждого типа исключения мы можем определить свою логику обработки. Конкретный тип исключения,
который мы хотим обработать, указывается в круглых скобках после оператора catch
:
catch(Тип_исключения $ex)
После названия типа указывается переменная этого типа (в данном случае $ex
), которая будет хранить информацию об исключении и которую мы можем использовать
при обработке исключения.
Если в блоке try
при выполнении кода возникает ошибка, то блок try
прекращает выполнение и передает управление блоку catch
, который обрабатывает ошибку.
А после завершения выполнения кода в блоке catch
программа продолжает выполнять инструкции, которые размещены после блока catch
.
Если в блоке try
при выполнении кода не возникает ошибок, то блок catch
не выполняется, а после завершения блока try
программа продолжает выполнять инструкции, которые размещены после блока catch
.
Например, обработаем ошибку с делением на ноль:
try { // код, который может вызвать исключение $a = 5; $b = 0; $result = $a / $b; echo $result; } catch(DivisionByZeroError $ex) { // обработка исключения echo "Произошло исключение:<br>"; echo $ex . "<br>"; } echo "Конец работы программы";
В данном случае код деления на ноль, поскольку он может потенциально вызвать ошибку, помещен в блок try
.
В блоке catch
обрабатывается ошибка типа DivisionByZeroError, которая генерируется при делении на ноль. Вся обработка сводится
к выводу информации на экран.
В итоге при выполнении программа выведет следующее:
Произошло исключение: DivisionByZeroError: Division by zero in D:localhosthello.php:14 Stack trace: #0 {main} Конец работы программы
Как видно из вывода программы, она не завершается аварийно при делении на ноль, а продолжает работу.
Типы ошибок и исключений
В PHP для разных ситуаций есть множество типов, которые описывают ошибки. Все эти встроенные типы применяют интерфейс Throwable:
Все типы делятся на две группы: собственно ошибки (класс Error) и собственно исключения (класс Exception).
А от классов Error
и Exception
наследуются классы ошибок и исключений, которые описывают конкретные ситуации. Например, от класса
Error
наследуется класс ArithmeticError, который описывает ошибки, возникающие при выполнении арифметических операций.
А от класса ArithmeticError
наследуется класс DivisionByZeroError, который представляют ошибку при делении на ноль.
Блок catch
Конструкция try..catch
позволяет определить несколько блоков catch
— для обработки различных типов ошибок и исключений:
try { $result = 5 / 0; echo $result; } catch(ParseError $p) { echo "Произошла ошибка парсинга"; } catch(DivisionByZeroError $d) { echo "На ноль делить нельзя"; }
При возникновении ошибки будет для ее обработки будет выбираться тот блок catch
, который соответствует вошникшей ошибки. Так, в данном случае
при делении на ноль будет выполняться второй блок catch
.
Если бы в блоке try
возникла бы ошибка, которая бы не соответствовала типам из блоков catch
(в данном случае — типам DivisionByZeroError и ParseError),
то такая ошибка не была бы обработана, и соответственно программа бы аварийно завершила свое выполнение.
Блоки catch с более конкретными типами ошибок и исключений должны идти в начале, а более с более общими типа — в конце:
try { $result = 5 / 0; echo $result; } catch(DivisionByZeroError $ex) { echo "На ноль делить нельзя"; } catch(ArithmeticError $ex) { echo "Ошибка при выполнении арифметической операции"; } catch(Error $ex) { echo "Произошла ошибка"; } catch(Throwable $ex) { echo "Ошибка при выполнении программы"; }
Класс DivisionByZeroError унаследован от ArithmeticError, который, в свою очередь, унаследован от Error, реализующего интерфейс Throwable. Поэтому
класс DivisionByZeroError представляет более конкретный тип и представляемые им ошибки должны обрабатываться в первую очередь. А тип Throwable представляет
наиболее общий тип, так как ему соответствуют все возможные ошибки и исключения, поэтому блоки catch с таким типом должны идти в конце.
В данном случае опять же в блоке try происходит ошибка деления на ноль. Но этой ошибке соответствуют все четыре блока catch
. Для обработки PHP будет
выбирать первый попавшийся, который соответствует типу ошибки. В данном случае это блок для обработки ошибки типа DivisionByZeroError.
Если нам надо обрабатывать в принципе все ошибки и исключения, то мы можем определить только обработку общего для всех них типа Throwable:
try { $result = 5 / 0; echo $result; } catch(Throwable $ex) { echo "Ошибка при выполнении программы"; }
Начиная с версии PHP 8.0 в блоке catch можно просто указать тип обрабатываемого исключения, не определяя переменную:
catch(DivisionByZeroError) { echo "Произошло исключение: деление на ноль"; }
Получение информации об ошибках и исключениях
Интерфейс Throwable
предоставляет ряд методов, которые позволяют получить некоторую информацию о возникшем исключении:
-
getMessage(): возвращает сообщение об ошибке
-
getCode(): возвращает код исключения
-
getFile(): возвращает название файла, в котором возникла ошибка
-
getLine(): возвращает номер строки, в которой возникла ошибка
-
getTrace(): возвращает трассировку стека
-
getTraceAsString(): возвращает трассировку стека в виде строки
Применим некоторые из этих методов:
try { $result = 5 / 0; echo $result; } catch(DivisionByZeroError $ex) { echo "Сообщение об ошибке: " . $ex->getMessage() . "<br>"; echo "Файл: " . $ex->getFile() . "<br>"; echo "Номер строки: " . $ex->getLine() . "<br>"; }
Результат работы:
Сообщение об ошибке: Division by zero Файл: D:localhosthello.php Номер строки: 11
Блок finally
Конструкция try..catch
также может определять блок finally. Этот блок выполняется в конце — после блока try и catch
вне зависимости, возникла или нет ошибка. Нередко блок finally
используется для закрытия ресурсов, которые применяются в блоке try.
try { $result = 5 / 0; echo $result . "<br>"; } catch(Throwable $ex) { echo "Ошибка при выполнении программы<br>"; } finally { echo "Блок finally<br>"; } echo "Конец работы программы";
Вывод программы:
Ошибка при выполнении программы Блок finally Конец работы программы
Конструкция try..catch..finally
может содержать либо все три блока, либо только два блока try
и либо блок catch
,
либо блок finally
.
Introduction
DivisionByZeroError class is a subclass of ArithmeticError class. This type of error occurs when division operation involves value of denominator as zero. This can also occur when a modulo operator (%) has 0 as second operator, and intdiv() function having second argument as 0.
DivisionByZeroError Example
In first example, we try to perform modulo division of 10 and 0 using % operator to induce DivisionByZeroError.
Example
Live Demo
<?php try { $a = 10; $b = 0; $result = $a%$b; echo $result; } catch (DivisionByZeroError $e) { echo $e->getMessage(); } ?>
Output
This will produce following result −
Modulo by zero
If call to intdiv() function with 0 as second argument also raises DivisionByZeroError as follows
Example
Live Demo
<?php try { $a = 10; $b = 0; $result = intdiv($a,$b); echo $result; } catch (DivisionByZeroError $e) { echo $e->getMessage(); } ?>
Output
This will produce following result −
Division by zero
Division operator (/) having 0 as denominator, however fails to raise error, instead raises warning because division results in PHP constant INF
Example
Live Demo
<?php try { $a = 10; $b = 0; $result = $a/$b; echo $result; } catch (DivisionByZeroError $e) { echo $e->getMessage(); } ?>
Output
This will produce following result −
PHP Warning: Division by zero in C:xamppphptest.php on line 5 INF