У меня есть большое математическое выражение, которое должно создаваться динамически. Например, как только я проанализировал "что-то", результатом будет строка типа: "$foo+$bar/$baz";
.
Итак, для вычисления результата этого выражения я использую функцию eval
... что-то вроде этого:
eval("\$result = $expresion;");
echo "The result is: $result";
Проблема в том, что иногда я получаю ошибки, в которых говорится, что было деление на ноль, и я не знаю, как поймать это исключение. Я пробовал такие вещи, как:
eval("try{\$result = $expresion;}catch(Exception \$e){\$result = 0;}");
echo "The result is: $result";
Или:
try{
eval("\$result = $expresion;");
}
catch(Exception $e){
$result = 0;
}
echo "The result is: $result";
Но это не сработает. Итак, как я могу избежать того, что мое приложение выйдет из строя, когда есть деление на ноль?
Edit:
Во-первых, я хочу кое-что прояснить: выражение построено динамически, поэтому я не могу просто оценить, если знаменатель равен нулю. Итак... что касается комментария Марка Бейкера, позвольте мне привести вам пример. Мой парсер мог бы построить что-то вроде этого:
"$foo + $bar * ( $baz / ( $foz - $bak ) )"
Парсер строит строку шаг за шагом, не беспокоясь о значении варов... так что в этом случае, если $foz == $bak
на самом деле деление на ноль: $baz / ( 0 )
.
С другой стороны, как предложил Пит, я попробовал:
<?php
$a = 5;
$b = 0;
if(@eval(" try{ \$res = $a/$b; } catch(Exception \$e){}") === FALSE)
$res = 0;
echo "$res\n";
?>
Но он ничего не печатает.