Tengo una gran expresión matemática que debe crearse dinámicamente. Por ejemplo, una vez que haya analizado "algo" el resultado será una cadena como: "$foo+$bar/$baz";
.PHP, ¿Cómo atrapar una división por cero?
Por lo tanto, para el cálculo del resultado de esa expresión que estoy usando la función eval
... algo como esto:
eval("\$result = $expresion;");
echo "The result is: $result";
El problema aquí es que a veces recibo mensajes de error que dice que hubo una división por cero, y no sé cómo atrapar esa excepción. He tratado de cosas como:
eval("try{\$result = $expresion;}catch(Exception \$e){\$result = 0;}");
echo "The result is: $result";
O:
try{
eval("\$result = $expresion;");
}
catch(Exception $e){
$result = 0;
}
echo "The result is: $result";
Pero no funciona. Entonces, ¿cómo puedo evitar que mi aplicación falle cuando hay una división por cero?
Editar:
En primer lugar, quiero aclarar algo: la expresión se construye de forma dinámica, por lo que no se puede simplemente eval si el denominador es cero. Entonces ... con respecto al comentario de Mark Baker, permítanme darles un ejemplo. Mi analizador podría construir algo como esto:
"$foo + $bar * ($baz/($foz - $bak))"
El analizador construir la etapa de colocación sucesiva a paso sin preocuparse por el valor de los VARs ... por lo que en este caso si $foz == $bak
hay de hecho una división por cero: $baz/(0)
.
Por otra parte como se sugiere Pete, he intentado:
<?php
$a = 5;
$b = 0;
if(@eval(" try{ \$res = $a/$b; } catch(Exception \$e){}") === FALSE)
$res = 0;
echo "$res\n";
?>
Pero no imprime nada.
Se puede comprobar si '$ expression' está dividiendo por cero de antemano? –
@Anthony Forloney: Buena pregunta, mi respuesta asumió que podrías, pero si Cristian está realmente usando eval para esto, entonces la respuesta es probablemente "no". – Powerlord
Usar 'eval' puede ser una mala idea. Ahora permitirá que su usuario final ejecute código PHP en su servidor.No conozco ninguna alternativa, así que no estoy publicando una respuesta, pero debes pensar si quieres que escriba cualquier código PHP, sin importar cuán destructivo sea tu sitio web. – Umang