《PHP精粹:编写高效PHP代码》——1.7节异常

简介:

本节书摘来自华章社区《PHP精粹:编写高效PHP代码》一书中的第1章,第1.7节异常,作者:(美)  Davey Shafik,更多章节内容可以访问云栖社区“华章社区”公众号查看

1.7 异常
异常(exception)是一个处理错误的面向对象方法。一些PHP扩展像往常一样仍会报错;很多最新的扩展(例如PDO)将代替抛出异常。异常也是对象,而且Exception是PHP的一个内置类。一个Exception对象将包含发生错误的位置(文件名或代码行)、一条错误消息和(可选)一个错误代码等信息。

1.7.1 处理异常
首先我们看看如何处理可能会抛出异常的函数。我们会使用一个PDO示例,因为PDO扩展抛出异常。在这里代码会试图创建一个数据库连接,但是会失败,因为nonsense主机不存在:


6a3ccbd06ac553073fc1365c40b1daa904741bfb


26e6dab245ebf5452b25d04274b1263b3f493c88

这段代码阐明了try/catch结构。在try块中,我们将想要的代码放到应用程序中运行,但我们知道代码可能会抛出一个异常。在catch块中,可以添加一些应对错误的代码,无论是处理它还是记录它,采取任何行动都是恰当的。
注意,当发生一个异常时,就像这里试图连接到数据库一样,PHP没有运行try块中其余的代码而直接跳转到catch块中。在这个示例中,数据库连接失败意味着我们根本看不到已连接到数据库的消息,因为这一行代码根本无法运行。
无finally子句
如果你在其他语言中使用过异常,你可能习惯于try/catch/finally结构;PHP没有附加的finally子句。

1.7.2 为什么要处理异常
比起会引发不同层次错误的传统方法,异常是一个更简洁的错误处理方法。在执行代码的过程中,我们可以根据错误的严重程度对异常做出反应。我们可以对问题进行评估,然后告诉系统如何恢复,或顺利地摆脱困境。
将所有的异常作为对象意味着我们可以扩展异常(很快会有示例演示),并且可以自定义异常的数据和反应。我们已经知道如何使用对象工作,这使得我们能更简单地把复杂功能添加到错误处理系统中。

1.7.3 抛出异常
我们已经看到如何处理由PHP内置函数抛出的异常,但是我们自己如何抛出异常呢?是的,我们肯定能够做到这一点:


88ae3f36e0312b5b04607d0247d22f354edb6be0

可根据需要为Exception类设置任何属性或添加任何方法。定义为一个空类也很常见,空类只是为了提供更多特定类型的异常,使我们识别出:应用程序的哪一部分遇到了问题而没有尝试以编程方式读取错误信息。
自动加载异常
此前,介绍了自动加载,为在哪里能找到类而定义规则,而在脚本中执行的代码并未包含这个类的定义。异常也是简单的对象,因此也可以使用自动加载功能来加载异常类。

通过所有特定的异常类可以捕捉不同的异常类型,将在下一节学习这一点。

1.7.5 捕捉特定类型的异常
思考如下这个代码示例可以抛出多个异常:


2df6f889373742de2950504cc819fb030836d2e0


5fdedfdc6242d5aceddb401836117b1a30f4b836

在这个示例中,开始实例化Courier和Parcel两个对象。Parcel对象既有地址又有重量;当发货的时候会检查它们。注意,这个示例使用了一个小小的rand()函数来产生各种包裹的重量!这是一个测试代码的有趣方法,因为有些包裹由于超重而引发异常。
在try块中,要求快递公司运送包裹。如果运气好,过程一切顺利,我们就会看到“parcel shipped”消息。这两个catch块让我们巧妙地处理失败结果,第一个catch块负责特定捕捉HeavyParcelException异常,任何其他类型的异常由第二个很普通的catch块捕捉。如果我们想首先捕捉Exception异常,所有的异常将最终在这里被捕捉,那么我们首先要保证这个catch块具有最特殊的异常类型。
实际上,这个catch块使用了类型提示来区分一个对象是否为可接受的类型。因此前面介绍的类型提示和多态性也适用于这里;一个HeavyParcelException异常也是一个Exception异常。
在这个示例中,异常从类的内部抛出,进而捕捉代码中调用对象方法的栈。没有捕捉到的异常会返回调用它的内容中,如果在这里它们仍然没有被捕捉,它们将继续通过调用栈向上抛出。当它们到达顶部仍然未被捕捉,我们将看到严重的错误:Uncaught Exception。

1.7.6 设定一个全局异常处理程序
为避免出现异常被抛出而代码捕捉失败的严重错误,可以为应用程序设定一个默认的行为。为做到这一点,使用了一个名为set_exception_handler()的函数。它接受一个回调作为它的参数,因此可以为使用的函数命名,例如,一个异常处理程序通常会在屏幕上给用户显示一个错误提示—这比一个严重错误的消息要好得多!
一个基本的异常处理程序类似于这样:


92997eacb8facbec36a9d6a51c9cc3d92ca75153

这里显示了一个异常处理程序,然后它调用set_exception_handler()方法注册这个函数来处理未捕获的异常。通常在脚本的开始部分声明和设置异常处理程序,或者放在引导文件中,如果你有一个的话。
默认错误处理
除了使用set_exception_hander()处理异常外,PHP也提供set_error_handler()方法处理错误。

示例异常处理程序使用error_log()函数在PHP的错误日志中写入错误的内容,打开日志文件会看到如下内容:


f1018da00d896adf5080ff51cae6623c9dade039

1.7.7 使用回调
刚才展示了回调函数的使用,正好我们可以看看是否还有其他可用的选择。回调广泛应用于PHP的各个方面,set_exception_handler()和set_error_handler()函数就是很好的例子。也可以使用回调,例如,在array_walk()这个函数中,要求PHP使用相同的操作,为一个数组中的每一个元素指定使用一个回调。
回调可以使用多种形式:
一个函数名
一个类名和一个方法名,其中方法是静态调用的
一个对象和一个方法名,其中调用的方法与提供它的对象相对应
一个closure(存储在变量中的一个函数)
一个lambda函数(就地声明的一个函数)
回调让我们使用匿名函数成为可能。为异常处理程序声明的匿名函数不会用于应用程序的任何其他地方,因此没必要为它取一个全局性的名称。在PHP手册的相关页面上还有更多关于匿名函数的内容。

相关文章
|
19天前
|
IDE PHP 开发工具
PHP中的类型提示与严格模式:提高代码可维护性
随着PHP语言的发展,开发者对代码的可读性、可维护性和可靠性有了更高的要求。PHP中的类型提示(Type Hinting)和严格模式(Strict Mode)为开发者提供了更强的类型检查机制,有助于提升代码质量和减少潜在的错误,尤其是在大型项目中。
|
1月前
|
安全 程序员 PHP
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第8天】在编程的世界中,错误和异常是不可避免的。它们就像路上的坑洼,可能会让我们的程序“跌倒”。但是,如果我们能够正确地处理这些异常,就可以让我们的程序更加稳健,就像我们学会了如何在坑洼的路上稳稳地行走一样。本文将介绍PHP中的异常处理机制,以及如何使用它来提升我们的代码质量。
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。
|
2月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
62 4
|
2月前
|
存储 Java 数据库连接
php学习笔记-代码基本语法-day01
本文是关于PHP编程语言的基础语法学习笔记,内容包括PHP的介绍、注释风格、数据类型、命名规范、常量和变量的使用,以及变量和常量相关的常用函数。文中详细解释了PHP的基本语法元素和一些易混淆的概念,如传值赋值与传址赋值、可变变量,以及如何检查变量是否已定义或为空。
php学习笔记-代码基本语法-day01
|
9天前
|
PHP 开发者
PHP中的异常处理:提升代码的健壮性
【10月更文挑战第40天】在PHP编程中,异常处理是确保应用稳定性的关键。本文将引导你理解异常处理的重要性,掌握如何在PHP中捕获和处理异常,以及如何通过自定义异常类来增强代码的错误管理能力。我们将一起探索如何利用PHP的异常处理机制,打造一个更加健壮和可靠的应用程序。
|
1月前
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性和扩展性
【10月更文挑战第13天】 本文将探讨PHP中常见的设计模式及其在实际项目中的应用。通过对比传统编程方式,我们将展示设计模式如何有效地提高代码的可维护性和扩展性。无论是单例模式确保类的单一实例,还是观察者模式实现对象间的松耦合,每一种设计模式都为开发者提供了解决特定问题的最佳实践。阅读本文后,读者将能更好地理解和应用这些设计模式,从而提升PHP编程的效率和质量。
|
1月前
|
PHP 数据库 开发者
PHP中的异常处理和自定义异常
【10月更文挑战第3天】在PHP编程中,异常处理是一个重要的话题。它允许开发者优雅地处理错误,提高代码的可读性和可维护性。本文将介绍如何在PHP中进行异常处理,包括基本的try-catch结构,以及如何创建和使用自定义异常类来处理特定的错误情况。通过实际示例,我们将看到如何使用异常处理机制来增强应用程序的健壮性和灵活性。
23 1
|
1月前
|
设计模式 SQL 安全
PHP中的设计模式:单例模式的深入探索与实践在PHP开发领域,设计模式是解决常见问题的高效方案集合。它们不是具体的代码,而是一种编码和设计经验的总结。单例模式作为设计模式中的一种,确保了一个类仅有一个实例,并提供一个全局访问点。本文将深入探讨单例模式的基本概念、实现方式及其在PHP中的应用。
单例模式在PHP中的应用广泛,尤其在处理数据库连接、日志记录等场景时,能显著提高资源利用率和执行效率。本文从单例模式的定义出发,详细解释了其在PHP中的不同实现方法,并探讨了使用单例模式的优势与注意事项。通过对示例代码的分析,读者将能够理解如何在PHP项目中有效应用单例模式。
|
1月前
|
程序员 数据库连接 PHP
PHP中的异常处理:提升代码的健壮性
【9月更文挑战第30天】在编程的世界里,错误和异常是不可避免的。本文将深入探索PHP中异常处理的机制,揭示如何通过有效的异常管理来增强代码的健壮性和可靠性。我们将从基础概念出发,逐步深入到高级应用,最后通过实际代码示例来巩固理论知识。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的指导和启示。
48 6
下一篇
无影云桌面