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 Ba​​ker的评论,让我举个例子。 我的解析器可以构建如下的东西:

"$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?