理解异常

时间:2013-01-18 10:03:14

标签: php exception

我已经阅读了文章,试图了解在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;
  }
}    

所以这是我的问题,为什么以及何时应该使用其中一个

8 个答案:

答案 0 :(得分:2)

  

为什么以及何时应该使用其中一个?

哦,这很容易:你永远不应该使用“无例外”:)不要滥用返回值作为状态标志。这是早期的一个坏习惯,只会让事情变得更复杂,因为那时你必须一遍又一遍地检查返回值甚至是它们的类型。

如果你有一个像inverse()这样的函数,它唯一应该做的就是“反转”。如果它不能做到这一点,这是一种特殊的情况,因此(你猜可能)是一个例外。

总结一下:当出现某种情况时,抛出异常,阻止函数/方法正常工作,并且函数/方法无法自行处理。

答案 1 :(得分:1)

关于“何时使用例外”有各种各样的意见。我的个人意见是:

  • 如果您使用自己的代码工作,那么基本上不需要抛出异常,因为您需要为它编写自己的处理程序 - 这也可以在不抛出异常的情况下完成。 / LI>
  • 如果您正在开发其他程序员正在使用的API,那么抛出异常会很有用,因此使用您的代码的开发人员知道,他必须小心处理错误,并了解错误原因是什么。 (而不只是获得null他可能会抓住NumberToSmallExceptionNotANumberException,....)

换句话说:当你已经知道如何处理异常时 - 不要抛出异常。如果处理应由其他开发人员决定,请使用您的代码 - 抛出它。

异常用于控制应用程序逻辑的流程。因此,请使用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)

使用例外有两个主要好处:

  1. 它们通过执行堆栈(意味着如果你有几个嵌套函数,你不必重新传递错误值,这是自动完成的。
  2. throw()语句后面的第一段代码是catch()语句中的代码。这意味着您不必在每个嵌套的函数/方法中进行数百次检查。
  3. 考虑到此功能,使用返回值在简单情况下很有用(例如您的情况)。在复杂的情况下,您可以在执行堆栈中的不同级别中出现10-20-30种不同的错误消息,使用异常是必须的,或者其他开发人员(甚至您在几个月内)在调试时会遇到重大问题

    这是我在问题上的2美分,希望它有所帮助。

    PS:在exceptions.log

    中记录异常非常有用