PHP 开发经典教程 (Part 12):程序缺陷排除(3

  set_error_handler()函数告诉脚本所有的错误都将被路由到我的用户自定义的oops()函数。该函数被建立以接受五个参数:错误类型、消息、文件名称、行号以及包含关于错误发生的上下文(包括和平台以及脚本信息)的许多信息的数组。上下文数组的最终元素包含有错变量的当前值。然后这些参数被用于创建一个比PHP标准的单行错误消息更友好且信息更丰富的错误提示页面。

  你可以使用此自定义的错误处理器在错误类型的基础上来改变用户所看到的错误消息。请看下一个例子,该例子演示了该技术的使用:

  到目前为止,我们一直在讨论处理由PHP自身所产生的错误,但为什么要停留在那里呢?PHP也允许你使用其内建的错误处理系统来生成你自己自定义的错误。

  这是通过一个名为trigger_error()的函数来完成的,该函数允许你生成为用户所保留的三种错误类型中的任意一个:E_USER_NOTICE、E_USER_WARNING和E_USER_ERROR。当这些错误被触发时,PHP内建的处理器将会自动唤醒以处理这些错误。

  你也可以使用同样的方法来处理异常。请向下滚动鼠标,让我向你展示如何去做。

  如果你正在使用PHP 5,那么除了目前为止所讨论的关于新的异常模型技术(异常是另外一种错误)之外你也有其他的选择。异常是PHP中新出现的技术(虽然它们已经在诸如Java和Python语言中多年了)而且它们正在引起人们大量的激动。

  在基于异常的方法中,程序代码被try()块结构包围起来然后该代码所产生的异常被catch()块结构“捕获”和解决。多个catch()块是可能的,其中每一个处理不同的错误类型;这就允许开发人员捕获不同类型的错误而且执行适当的异常处理。

  当PHP遇到被包含在try-catch()块内部的代码时,它首先试图执行try()块内部的代码。如果该代码被处理时无异常产生,那么控制就转移到try-catch()块之后的代码行。然而,如果在运行try()块内部的代码时产生了异常,那么PHP在发生异常的地方停止该try()块的执行然后检查每个catch()块以查看是否有一个该异常的处理器。如果找到一个处理器,那么在适当的catch()块内部的代码得到执行;如果没有找到,那么就产生一个致命的错误。使用异常以一种良好的方式来处理该致命错误甚至也是可能的;请访问以获得更多的关于这方面的内容:

  异常本身通过PHP的throw语句来产生。Throw语句需要被传递一个描述性消息和一个可选的错误代码。当异常被产生时,该描述和代码将会对异常处理器变得可用。

  不要在该点上对“异常类型”过多担心(所有的都会被简单介绍)。目前,所有你需要知道的就是上面的catch()块将会捕获所有的异常而无论其类型。

  现在,之前的代码清单中有一个问题。虽然catch()块将会捕获异常然后打印一条消息,但是它不能显示throw语句所发送的异常的描述性消息。为了访问该消息和一些其他有趣的信息片段,有必要使用一些Exception对象内建的方法。请看之前脚本的修订版,其对此做了解释说明:

  你可以通过子类化的Exception对象然后使用多个catch()块以不同的方法来处理不同的异常。下面的例子是对这点的一个简单解释:

  请注意,因为PHP会一直使用与异常类型匹配的第一个catch()块,而且因为Exception类匹配所有的异常,所以catch()块必须按照最精确的catch()块优先的顺序进行排列。这个在上述例子中已经实现,上述例子中,catch()块出现在列表的最后。

  下面是另外一个例子,该例子解释说明了一个更加有用的应用程序(在用户验证的类中使用异常模型以提供易于理解的错误处理)。请看:

相关阅读