PHP函数的返回值和异常处理

5

我正在阅读一些关于PHP的书籍(具体来说是Welling和Thomson的“PHP和MySQL Web开发”),同时我也是一名新的大学本科生。我有点好奇为什么作者选择了两种不同的方式来终止函数的执行,例如:

if (!$result) {
    throw new Exception('Password could not be changed.');
} else {
    return true;
}

在我看来,这似乎有点不一致,更合理的做法是返回false并让调用者检查被调用者的返回值并处理它。PHP代码常常像这样吗?在使用异常时,这是期望的风格吗?


1
这两个人,Welling和Thomson因为他们一无所知而出名。使用异常来验证用户输入是一种冒险的游戏。我只将其限制在系统错误上使用。 - Your Common Sense
我也这么想 :) 说实话,对于像这样的事情使用“异常(Exceptions)”似乎有点过重。 - SHC
4个回答

4

是的,我同意这并没有多少意义。要么通过返回值来信号化错误条件,要么使用异常。如果返回值始终为true(在发生错误时引发异常),那么您可能不需要返回任何内容(在PHP中等价于返回NULL)。


2

这似乎只是一种纯粹的风格。我同意您的观点,返回true或false会更加一致,并且如果不期望或不可接受为假,则调用代码应抛出异常。

我认为PHP社区还没有完全制定出这样的行为惯例,因此我不会说它既常见又不常见。有许多不同的方式来设计这样的系统在PHP中。


1

大多数情况下,当您看到PHP代码时,它将完全关于编写代码的人及其特定风格。

我不认为代码片段有什么不一致之处。在大多数语言中,异常是处理错误的适当方式。他可以省略返回语句,但我知道许多人觉得函数应始终返回值。


我觉得如果这个函数更加一致,那么返回值应该反映出来。就像strcmp()返回<0、0或>0一样,我觉得使用一致的类型来表示返回值会更有意义。说实话,在大学里我们从未学习过关于异常和异常处理的知识,所以我不确定这种编码风格是否符合商业代码的要求。 - SHC
我们所看到的只是一个代码片段。很难判断如何处理执行流程。个人而言,我不会在if else语句中抛出异常。我觉得用大括号包装执行代码并不能帮助它。在我的看法中,就错误处理而言,由于try..catch块,异常是最好的选择。它为您提供了在停止执行之前纠正或抑制错误的机会。 - the_machinist_

0
在PHP中,抛出的异常如果没有被处理,会终止脚本(或被调用的函数),并且不返回任何内容:点击这里。另一方面,使用return语句会返回一个值。因此,使用这个问题中的示例并不是一个约定或编码风格的问题 - 这个示例不符合异常处理的目的(即在遇到异常后防止程序崩溃)。
这就是为什么PHP提供了一个全局的Exception类的原因。良好的编程实践是:
  1. 在try-catch语句的catch块中始终处理异常。
  2. 如果您对引发异常的原因不感兴趣,但希望程序/脚本继续执行,请在catch块中捕获全局的Exception类并处理它。
  3. 如果您对异常感兴趣并且知道可能引发此类异常的原因,请创建一个实现Throwable接口或继承全局Exception类的类。然后在程序中捕获此类异常对象并处理它们。
  4. 最后,如果您希望脚本(或被调用的函数)在发生异常时终止,仍然最好在捕获更一般的异常对象(如全局Exception类的对象)后,在catch块中抛出此类异常。捕获的异常可以由调用程序处理,或者如果未处理,则终止脚本。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接