4

我已经阅读了有关试图了解 php 中使用哪些异常的文章的文章,并且我已经阅读了论坛中已经给出的答案。对我来说至少有一些意义的答案之一是:php 中的异常真的那么有用吗?

这是一个简单的函数,用于在使用和不使用异常(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;
  }
}    

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

4

8 回答 8

2

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

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

如果你有一个函数inverse(),它唯一应该做的就是“逆”。如果它做不到,那就是例外情况,因此(您可能会猜到)例外。

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

于 2013-01-18T10:06:16.660 回答
1

关于“何时使用异常”有各种意见。我个人的看法是:

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

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

不应使用异常来控制应用程序逻辑的流程。因此使用 if / else 语句。

但这些只是我的十美分。

于 2013-01-18T10:13:20.790 回答
0

尤其是当您使用面向对象编程时,异常非常方便。例如,在您使用数据库库的应用程序中,当它无法建立连接时会引发异常。在这种情况下,您可以在某处捕获该异常,并显示一个特殊页面,告诉用户数据库不工作。

于 2013-01-18T10:06:44.823 回答
0

当一个方法调用多个级别时,异常的最佳用法可能会发生。

想像我调用方法A,然后调用方法B,然后调用方法C。发生这种情况时,如果不使用异常,方法A必须知道方法B的所有不同类型的错误消息。而方法B必须知道C也是一样的。但是通过使用异常,可以很容易地捕获方法 C 的错误,而无需方法 A 和 B 的帮助。

于 2013-01-18T10:06:48.673 回答
0

当您的脚本遇到错误时,应该使用异常,在示例中,您不能除以零,因此您有一个逻辑错误,因此异常是合适的。

使用异常可以让您看到更好的错误消息,并且在调试时会有所帮助,而不是简单地打印出可能是任何内容的字符串。此外,您可以捕获异常,以便检测何时出现问题,而简单地输出字符串并没有多大帮助。

查看有关此的 PHP 文档以获取更多信息。

于 2013-01-18T10:07:22.700 回答
0

在编写复杂和/或可扩展的软件时,异常是一种非常宝贵的工具,但是说返回值不利于报告异常,恕我直言,这是一种过于简单甚至教条的方法。

在这种特定情况下,返回一个null值是完全合理的,如“不存在反参数”。对我来说,最重要的一点是它inverse实际上并没有任何事情;它只是提供一些信息(即它是“只读的”,它绝对没有副作用)。

请注意,“绝对没有副作用”也是一个很好的经验法则,这意味着您绝对不应该echo在函数内部,除非回显是它首先存在的原因。

如果期望在inverse成功调用后程序的状态会发生变化并且inverse由于任何原因无法执行此更改(也许它传递了错误的参数;也许它需要的资源不可用;等等)那么你绝对应该抛出一个异常并让调用者决定如何处理错误。

于 2013-01-18T10:14:07.317 回答
0

可以这样想:

有时,值$x来自用户(例如,来自 HTML 表单或其他东西),在这种情况下,您希望显示错误(可能类似于"The frobing level needs to be different than zero")。

其他时候,您从数据库中获取值,在这种情况下,告诉用户有关 frobing 级别或类似的东西是无用的,您将希望在服务器上的某处显示错误页面并记录详细信息(甚至向管理员发送电子邮件)。

对于第二个示例,实际上不可能控制发生错误时发生的情况(每次都打印相同的消息)。

正确的做法是让调用函数的代码决定发生错误时会发生什么。例外是这样做的一种方式。

于 2013-01-18T10:15:45.757 回答
0

使用异常有两个主要好处:

  1. 它们通过执行堆栈(这意味着如果您有几个嵌套函数,则不必重新传递错误值,这是自动完成的。
  2. 语句之后的第一段代码是throw()语句中的代码catch()。这意味着您不必对您拥有的每个嵌套函数/方法进行数百次检查。

考虑到此功能,使用返回值在简单情况下(例如您的情况)很有用。在复杂的情况下,你有 10-20-30 条不同的错误消息可以出现在执行堆栈的不同级别,使用异常是必须的,否则其他开发人员(/甚至你几个月后)在调试时会遇到重大问题.

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

PS:将异常记录在exceptions.log.

于 2013-01-18T10:20:15.803 回答