PHP,如何通过零来捕获一个分区?
我有一个很大的数学表达式,必须动态创建。 例如,一旦我分析了“某些东西”,结果将是一个字符串,如: "$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";
但它不起作用。 那么,如何避免我的应用程序在零除之后崩溃?
编辑:
首先,我想澄清一些事情:表达式是动态构建的,所以我不能仅仅评估分母是否为零。 所以......关于Mark Baker的评论,让我举个例子。 我的解析器可以构建如下的东西:
"$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 "$resn";
?>
但它不打印任何东西。
if ($baz == 0.0) {
echo 'Divisor is 0';
} else {
...
}
而不是使用eval,如果您在evalled表达式中使用用户输入,这是非常危险的,为什么不在PHPClasses上使用适当的解析器(如evalmath),并在除以零时引发干净的异常
这是另一个解决方案:
<?php
function e($errno, $errstr, $errfile, $errline) {
print "caught!n";
}
set_error_handler('e');
eval('echo 1/0;');
请参阅set_error_handler()
您只需设置一个错误处理程序即可在发生错误时引发异常:
set_error_handler(function () {
throw new Exception('Ach!');
});
try {
$result = 4 / 0;
} catch( Exception $e ){
echo "Divide by zero, I don't fear you!".PHP_EOL;
$result = 0;
}
restore_error_handler();
链接地址: http://www.djcxy.com/p/11901.html
上一篇: PHP, How to catch a division by zero?
下一篇: How to suppress the "Division by zero" error and set the result to null for the whole application?