当前位置: 首页 > 面试题库 >

PHP,如何捕捉零除?

曹华荣
2023-03-14
问题内容

我有一个很大的数学表达式,必须动态创建。例如,一旦我已经解析了“东西”,结果就会像一个字符串:"$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";

但这行不通。因此,如何避免被零除的应用程序崩溃?

编辑:

首先,我想澄清一下:表达式是动态构建的,因此如果分母为零,我不能仅仅求值。所以…关于马克·贝克的评论,让我举一个例子。我的解析器可以构建如下内容:

"$foo + $bar * ( $baz / ( $foz - $bak ) )"

解析器逐步构建字符串,而无需担心vars的值…因此,在这种情况下,如果$foz == $bak实际上是被零除:$baz / ( 0 )

另一方面,正如皮特建议的那样,我尝试了:

<?php
$a = 5;
$b = 0;

if(@eval(" try{ \$res = $a/$b; } catch(Exception \$e){}") === FALSE)
        $res = 0;
echo "$res\n";
?>

但它不会打印任何内容。


问题答案:

if ($baz == 0.0) {
echo ‘Divisor is 0’;
} else {

}


而不是使用eval,如果您在已评估的表达式中使用用户输入,则非常危险,为什么不在PHPClasses上使用适当的解析器(如evalmath),并在除以零时引发干净的异常



 类似资料:
  • 在节点中。在js服务器上,捕获SIGTERM和捕获SIGINT有什么区别吗? 我认为进程不应该能够防止SIGINT关闭? 我是否能够捕获两个信号并阻止退出?我的实验表明答案是肯定的,但从我所读到的内容来看,SIGINT总是假设关闭一个进程。 或者我把SIGINT和SIGKILL混淆了?也许SIGKILL是我无法恢复的信号? 捕捉这些信号当然可以让我优雅地关机: 我想我把SIGINT和SIGKILL

  • 我想捕获并忽略以下tomcat。因为我的程序没有必要注意这个。 知道如何以及在哪里可以捕捉到这个异常吗?以下是例外情况:

  • 问题内容: 在Java中是否有捕捉到内存不足错误()的问题? 问题答案: 是的 。以下是一些可能有意义的示例: 如果您想通过 优雅地关闭 程序来处理它 如果要向用户显示问题或 记录错误 根据您的设计,您甚至可以清理内存并 恢复工作状态 但是 ,请注意,通常情况下(除非您处在一次要分配大量内存的位置),对于这些情况,您可能不会专门捕获OutOfMemoryError,而是始终在顶部进行操作主要入口点

  • 我以为我做得对。 但我还是得到了崩溃而不是打印声明。我对避免异常不感兴趣(在本例中,我故意通过添加一个具有现有主键的对象来导致异常),但我希望能够捕获它并防止崩溃。这可能吗?如果可能,怎么可能?

  • 编辑:我已经用symfony设置了登录表单,授权工作正常。但是我想更深入地了解一下symfony的安全包是如何管理它的。 我想学习/了解Symfony安全处理认证的方式。如果我理解得很好,到目前为止,在Symfony中触发认证check_path行security.yml中指定的URL"/login_path": 然后控制器/监听器/服务通过变量POST[_username]和POST[_pass

  • 我想检查在页面之间导航时是否收到错误消息。当错误消息出现时,测试将被终止并进行报告。为此,我使用了以下与站点上的错误消息相关的元素。