gpt4 book ai didi

php - 为什么必须手动抛出异常?

转载 作者:行者123 更新时间:2023-11-27 23:16:16 25 4
gpt4 key购买 nike

我已经在 PHP 和 C++ 中尝试过这个,所以我的问题只针对它们。为什么我们必须自己抛出异常,并且在发生异常问题时不会自动抛出异常。

PHP 代码优先

<?php 
try{
$a=1;
$b=0;
echo $a/$b;
} catch (Exception $e) {
echo "Error : ".$e->getMessage();
}
?>

为什么这段代码不抛出除以零的异常?。可以通过以下方式完成

<?php 
try{
$a=1;
$b=0;
if($b==0)
{
throw new Exception("What's the point in an exception if its not automatic and i have to throw it myself");
}
echo $a/$b;
} catch (Exception $e) {
echo "Error : ".$e->getMessage();
}
?>

但是如果我必须自己为可能的异常编写代码,那么异常处理有什么意义,那么为什么不使用任何简单的错误报告模式呢?

以下同理

C++代码

int main()
{
try{
int a=1;
int b=0;
cout<<(a/b);
}
catch (string e)
{
cout << e << endl;
}
}

这不会生成异常,生成运行时错误并使应用程序崩溃,如果异常处理未到位,这将是预期的。后续作品

int main()
{
try{
int a=1;
int b=0;
if(b==0)
{
throw string("What's the point in an exception if its not automatic and i have to throw it myself");
}
cout<<(a/b);
}
catch (string e)
{
cout << e << endl;
}
}

问题

为什么我必须手动检查这些变量才能发现错误?当我已经告诉代码这将发生时,异常真的是异常吗?那为什么它比基本的 if 条件更受欢迎

最佳答案

至少对于 C++ 来说,原因是检查零除数然后抛出和处理一个实验会严重影响某些系统的性能。因此,根据 C++ 标准,除以零是未定义的行为。

5.6 乘法运算符

4 The binary / operator yields the quotient, and the binary % operator yields the remainder from the divisionof the first expression by the second. If the second operand of / or % is zero the behavior is undefined. Forintegral operands the / operator yields the algebraic quotient with any fractional part discarded;81 if thequotient a/b is representable in the type of the result, (a/b)*b + a%b is equal to a; otherwise, the behaviorof both a/b and a%b is undefined

有些实现会抛出异常。但是如果代码是用不同的编译器编译的,依赖它可能会导致意想不到的结果。例如参见 SEH在 msvc 中

5个表达式

4 If during the evaluation of an expression, the result is not mathematically defined or not in the range ofrepresentable values for its type, the behavior is undefined. [ Note: most existing implementations of C++ignore integer overflows. Treatment of division by zero, forming a remainder using a zero divisor, and allfloating point exceptions vary among machines, and is usually adjustable by a library function. —end note ]

关于php - 为什么必须手动抛出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16106973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com