我已经阅读了文章,试图了解在php中使用的异常,我已经完成了论坛中已经给出的答案。对我来说至少有一点意义的答案之一就是这个:Are exceptions in php really that useful?
这是一个简单的函数,用于在使用和不使用异常(source)的情况下查找整数的倒数:
例外:
function inverse($x) {
if ($x==0) {
throw new Exception('Division by zero.');
} else {
return 1/$x;
}
}
try {
inverse();
}
catch (Exception $e) {
echo $e->getMessage();
}
无一例外:
function inverse($x) {
if ($x==0) {
echo "I'm zero. Don't let me be the denominator.";
} else {
return 1/$x;
}
}
所以这是我的问题,为什么以及何时应该使用其中一个?
答案 0 :(得分:2)
为什么以及何时应该使用其中一个?
哦,这很容易:你永远不应该使用“无例外”:)不要滥用返回值作为状态标志。这是早期的一个坏习惯,只会让事情变得更复杂,因为那时你必须一遍又一遍地检查返回值甚至是它们的类型。
如果你有一个像inverse()
这样的函数,它唯一应该做的就是“反转”。如果它不能做到这一点,这是一种特殊的情况,因此(你猜可能)是一个例外。
总结一下:当出现某种情况时,抛出异常,阻止函数/方法正常工作,并且函数/方法无法自行处理。
答案 1 :(得分:1)
关于“何时使用例外”有各种各样的意见。我的个人意见是:
null
他可能会抓住NumberToSmallException
,NotANumberException
,....)换句话说:当你已经知道如何处理异常时 - 不要抛出异常。如果处理应由其他开发人员决定,请使用您的代码 - 抛出它。
异常不用于控制应用程序逻辑的流程。因此,请使用if / else语句。
但这些只是我十美分。
答案 2 :(得分:0)
特别是当您使用面向对象的编程时,异常非常方便。例如,在使用DB库的应用程序中,该库在无法建立连接时抛出异常。在这种情况下,您可以在某处捕获该异常,并显示一个特殊页面,告诉用户数据库无法正常工作。
答案 3 :(得分:0)
当方法调用多个级别时,可能会发生异常的最佳用法。
想想我调用方法A,然后调用方法B,并调用方法C.当发生这种情况时,如果不使用异常,方法A必须知道方法B的所有不同类型的错误消息。方法B必须以同样的方式了解C。但是通过使用异常,可以在没有方法A和B的帮助下轻松捕获方法C的错误。
答案 4 :(得分:0)
当您的脚本遇到错误时应该使用异常,在示例中您不能除以零,因此您有逻辑错误,因此异常是合适的。
使用异常允许您查看更好的错误消息,并在调试时提供帮助,而不是简单地打印出可能是任何内容的字符串。此外,您可以捕获异常,以便您可以检测出现问题的时间,而只是输出字符串并没有多大帮助。
查看PHP docs on this了解详情。
答案 5 :(得分:0)
在编写复杂和/或可扩展的软件时,异常是一种非常宝贵的工具,但是说返回值不适合报告异常,恕我直言,这是一种过于简单甚至教条的方法。
在这种特定情况下,返回null
值是完全合理的,因为“参数的倒数不存在”。对我来说,最重要的一点是inverse
实际上并没有做任何事情;它只是提供一些信息(即它是“只读”,它绝对没有副作用)。
请注意,“绝对没有副作用”也是一个很好的经验法则,这意味着你绝对不应该在函数中echo
,除非回声是它首先存在的原因。
如果期望在成功调用inverse
之后,程序的状态会发生变化,inverse
无论出于何种原因都无法执行此更改(也许它通过了错误的参数;也许是资源它需求不可用;等等那么你应该绝对抛出异常并让调用者决定如何处理错误。
答案 6 :(得分:0)
这样想:
有时,$x
的值来自用户(例如来自HTML表单或其他内容),在这种情况下,您希望显示错误(可能类似"The frobing level needs to be different than zero"
)。< / p>
其他时候,你从数据库中获取值,在这种情况下告诉用户有关frobing级别或类似的东西是没用的,你会想要显示错误页面并在服务器上的某处记录详细信息(甚至向管理员发送电子邮件)。
对于第二个例子,实际上不可能控制出错的情况(每次都打印相同的信息)。
正确的做法是让调用函数的代码决定发生错误时会发生什么。例外是这样做的一种方式。
答案 7 :(得分:0)
使用例外有两个主要好处:
throw()
语句后面的第一段代码是catch()
语句中的代码。这意味着您不必在每个嵌套的函数/方法中进行数百次检查。考虑到此功能,使用返回值在简单情况下很有用(例如您的情况)。在复杂的情况下,您可以在执行堆栈中的不同级别中出现10-20-30种不同的错误消息,使用异常是必须的,或者其他开发人员(甚至您在几个月内)在调试时会遇到重大问题
这是我在问题上的2美分,希望它有所帮助。
PS:在exceptions.log
。