错误是每一门计算机语言不可缺少的部分——尽管他领程序员生厌!
PHP拥有一些令人激动的除虫工具——细致精准的错误抛出、错误句柄与错误报告。合理的利用错误管理可以写出稳定的和有检测已知问题能力的应用,然后通过优雅的方式处理他们。
作者提示:本章我们只介绍传统的程序错误管理。PHP 5中面向对象的错误管理会在面向对象开发章节中详细介绍。
错误的种类繁多,PHP中通常与错误等级对应:
编译时错误 | 当解释器编译一个脚本的时候检测到的错误。在其出错脚本中不可被捕获。 |
致命错误 | 此种错误直接终端程序运行,不能被捕获。 |
可回收错误 | 此种错误描述一个严重的错误,但可以被捕获。 |
警告 | 仅指示一个运行中的故障。不会中断脚本运行。 |
提醒 | 显示一个次要的问题。不会中断脚本运行 |
根据上表描述可以看出,并不是所有的错误都可以被捕获。如果遇到编译错误与致命错误,至少可以知道有错误发生。因此,尽可能优雅的处理这些问题。
默认情况下,PHP会将所有的错误报告输出在脚本显示中。除非你碰巧在调试环境中,你将利用这个罕见的情况:允许用户看到你脚本中的错误——这可能是一个重大的安全问题。(Siemen注:看着有点蛋疼,作者想要表达的意思就是如果你要是正式发布产品的时候还没有关闭错误报告,所有用户都可以看到错的详细情况,这是非常不安全的。)
幸运的是,php.ini文件中很多配置选项允许你设定要显示哪些错误。最常用的一组是error_reporting, display_errors和log_errors.
error_reporting指令决定着PHP报告哪些错误。一系列的内建常量用来预设需要显示的错误级别。比如以下设置报告除了提示外的所有错误:
error_reporting=E_ALL & ~E_NOTICE
作者提示:错误报告也可以在脚本中调用error_reporting()方法来动态改变。
display_errors和log_error指令则可以决定报告的去处。如果display_errors被开启,错误信息会被显示在脚本输出结果中;通常来说,对于正式上线的环境这么做是不可取的,因为任何人都可以看到错误的详细信息。这种情况下,开启log_errors来替代display_errors是个不错的选择,它能够将错误信息记录到服务器错误日志中供你查阅。
你的脚本应该始终可以从一个被捕获的错误中恢复运行——甚至如果可以的话通知用户有错误发生同时发送详细的错误信息给应用维护人员。可以这么说,你的脚本不会因为一个未知的错误发生而终止运行——给访问者一个友好的提示同时绕开一些致命的问题。
幸运的是,错误处理非常容易上手。你的脚本可以通过一个PHP内置的错误句柄函数set_error_handler()来调整一个错误的发生:
$oldErrorHandler = ''; function myErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext) { global $oldErrorHandler; logToFile("错误:{$errStr} 在 {$errFile} 文件中的第 {$errLine} 行 "); // 调用老的错误句柄 if ($oldErrorHandler) { $oldErrorHandler ($errNo, $errStr, $errFile, $errLine, $errContext); } } $oldErrorHandler = set_error_handler ('myErrorHander');
真如你所见,老的错误句柄函数的名称(可以自定)是set_error_handler()函数的返回值——这可以让你同时创建多个错误句柄,因此我们可以使用不同的函数来处理不同类型的错误。
需要重点说明的是,你定义的错误句柄是从PHP的错误机制中完全移交过来的——也就是说你必须承担所有的错误句柄并且处理,与必要的终止脚本运行。
修正:
2010年04月06日 —— Siemen
1. 所有代码部分使用csdn重新插入