网站首页 > PHP教程> 文章内容

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

※发布时间:2013-6-1 14:32:29   ※发布作者:habao   ※出自何处: 

  文本Tag:开源开发语言【IT168 专稿】第一部分

  你的代码

  即使是最好的开发人员有时也会犯错误。那就是为什么大部分编程语言(包括PHP)提供了内建的捕获错误然后采取补救措施的能力。这个措施可以和显示一条错误消息一样简单,或者和向站点管理员发送一封具有完整的堆栈径的电子邮件一样复杂。

  为了更容易地执行这些,PHP提供了完整特征错误处理API,该API可用于捕获和解决错误。除了决定用户可见哪种类型的错误之外,你也可以使用你自己自定义(通常来讲,更有创造性的)函数来代替内建的错误处理机制。如果你正在使用PHP 5,那么你就得到一个意外收获:一种全新的异常模型,该模型允许你将你的代码以类似于Java的try-catch()块结构封装起来以获得更加有效的错误处理。

  在PHP 101的本次版本中,我将会讨论所有的这些事情,给你一个如何在你的PHP应用中增加错误处理的快速课程。继续阅读吧,因为这是一个非常酷的玩意!

  在我们进入如何编写错误处理器的本质之前,你需要知道一些理论知识。

  通常情况下,当一个PHP脚本遇到一个错误时,它显示一条错误原因的消息然后可能也(取决于错误的严重程度)终止脚本的执行。现在,虽然这种行为在开发阶段是可以接受的,但一旦PHP应用程序被分发到真实的用户时它就不能再继续发生了。在“实况”情况下,显示模糊的错误消息(通常情况下对非技术用户是不能理解的)是不够专业的;拦截这些错误然后或者解决错误(如果解决方法可行的话)或者以一种易于理解的错误消息通知用户(如果解决方法不可行的话)而更加专业。

  PHP中有三种基本的运行时间错误类型:

  1. 注意:当执行一个脚本时,这些是PHP遇到的微不足道的、非关键性的错误(比如,访问一个仍没有被定义的变量)。默认情况下,这类错误根本不会被展示给用户(但是,正如你将看到的,你可以改变这种默认行为)。

  2.:这是更严重的错误(比如,试图包含一个不存在的文件)。默认情况下,这些错误被显示给用户,但它们不会导致脚本终止执行。

  3. 致命错误:这类错误是严重的错误(比如,例示一个不存在的类的对象或者调用一个不存在的函数)。这些错致脚本立即终止执行,然后PHP的默认行为就是当它们发生时将其显示给用户。

  应了解,PHP脚本中的语法错误(比如,丢失括号或者分号)被作为一个致命错误且导致脚本的终止运行。那就是为什么如果你在你的PHP语句结尾忘记分号,那么PHP将会执行你的脚本直到你修正了这个错误的原因。

  PHP错误可以由Zend引擎、PHP内建函数或者用户自定义函数来产生。它们可能发生在开始、解析、编译或者运行时。在PHP内部,这些变化可以由12种不同的错误类型来表示(PHP 5中的),而且你可以在中阅读关于它们的信息。指定的常量(比如E_NOTICE和E_USER_ERROR)提供了一种方便的方法以涉及不同的错误类型。

  这里是一个快捷的提示:大部分时间里,你将会担心运行时间错误(E_NOTICE、E_WARNING和E_ERROR)和用户触发错误((E_USER_NOTICE、E_USER_WARNING和E_USER_ERROR)。在调试阶段期间,你可以使用捷径E_ALL类型来看你的脚本所产生的所有的致命和非致命错误,而且在PHP 5中,你也可能打算使用新的E_STRICT错误类型来查看影响你的代码前向兼容性的错误。

  早期告警

  将理论放到一旁,让我们现在将其应用到一些例子中。考虑下面的代码段:

  如果你运行这个脚本,那么你将会得到一个非致命的错误(E_WARNING),该错误意味着如果在对explode()调用的后面还有语句,那么这些语句会得到执行。你亲自试试然后看看!

  为了产生一个致命的错误,你需要投入一些更多的工作。请看下面:

  这里,对不存在的函数的调用绊到了PHP的警报线然后产生了一个致命错误,该错误立即停止了脚本的执行。

  现在,更有趣一点了吧。你可以通过使用内建的PHP函数error_reporting()来控制向用户显示哪条错误消息。该函数接受一个指定的常量然后告诉脚本只报告与该类型匹配的错误。为了看看这方面的实际操作,考虑下面的为“隐藏”非致命错误而对之前脚本之一的改写:

  然而,请记住,错误不被报告并不意味着它没有发生。即使上述脚本不会显示一个可见的错误消息,但脚本执行将会在错误点处停止而且该点随后的语句将不被执行。error_reporting()函数给了你显示哪个错误的控制权;但它不能错误本身的发生。

  请注意,在php.ini内具有进一步的设置以用于生产一线。你可以(且应该)关闭display_errors、指定error_log文件和打开log_errors。

  也请注意,所使用的隐藏错误消息的方法,虽然极其简单,但不被推荐做一般性的使用。不管错误类型,捕获所有的错误而且忽略它们是一种的编程习惯;提前预测可能的错误然后编写这些错误的防御性代码然后适当的处理这些错误要比上述方法好的多(而且更专业)。这会防止你的用户在错误发生时发现他们自己看到的是一个莫名其妙的空白页面。

  构造你自己的错误处理器

  请记住这个,让我们来讨论一些关于改变错误被处理的方式。考虑一个典型的PHP错误消息:它列出了错误类型、一条描述性消息和产生错误的脚本的名字。大部分情况下,这常足够的,但如果你的老板是一个要求苛刻的客户而且要求必须有一种“更好的方法”时该怎么办呢?

  嗯,这里有一种方法。它就是一个被称为set_error_handler()的小函数而且它允许你将所有的PHP错误转移给一个你已经定义的自定义函数而不是将其发送到默认的处理器。该自定义函数必须能够最少接受两个强制性参数(错误类型及其对应的描述性消息)一直到三个另外的参数(错误发生地的文件名称和行号以及错误发生时的变量空间转储)。

  下列例子或许可以使这点更清楚些:

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

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

  请注意,某些错误类型不能使用该方法处理。举例而言,一条致命的E_ERROR将PHP脚本的继续执行,因此,它永远无法达到用户自定义的错误处理机制。访问以获得更多的关于这点的信息。

相关阅读
重庆学习网zslpsh,0755深圳房产人才招聘网,拾年网90后,anedc股票,最新电影下载淘娱淘乐,重庆中学生网高考,重庆中学生网高考,学习重庆方言网,重庆中学生学习方法,重庆俗语网,中学生网zslpsh,0755深圳交友网,重庆初中生,贵州重庆方言网,025新闻网,西南重庆方言歌曲,025南京交友网,重庆农家乐美女,观赏蟹种类zadull,云南重庆方言网,重庆中学学习网,028成都交友网,推广taoyutaol,西南四川方言网,观赏龟论坛zadull,四川重庆方言网,022天津交友网,重庆中学生网家长,鹦鹉鱼zadull,重庆俗语,电影淘娱淘乐,taoyutaole娱乐,华夏视讯网,0755深圳旅游招聘,昆明重庆方言网,淘娱淘乐影视,www.00game.net,观赏鱼zadul,重庆高考zslpsh,重庆中学生网高考,027房产招聘网,坝坝舞wagcw,西南重庆方言网,贵州重庆方言网,重庆言子儿网,热带鱼zadull,重庆高考zslpsh,0755深圳旅游招聘网,淘娱淘乐影视网,0571.361.cm,重庆方言学习网,028成都新闻,异形观赏鱼种类,影视网淘娱淘乐,最新电影下载淘娱淘乐,0773桂林论坛,拾年网80后动画片,观赏蟹论坛zadull,观赏龟繁殖教程,重庆一中zslpsh,重庆俗语网,广场舞wagcw,观赏虾的种类zadull,观赏鱼观赏虾观赏龟,西南方言网,观赏鱼之家论坛zadull,战争前线辅助00game,西南重庆方言小说,重庆中小学zslpsh,推广taoyutaol,战争前线论坛00game,0871交友网,025南京新闻网,重庆言子儿网站,娱乐taoyutaole,022天津交友网,025新闻网,重庆中学生网学习,022天津交友网,重庆方言歌网,www.120.cm健康网,anedc股票,重庆初中生