在本章中,我们将主要讨论如何调试PHP脚本。完成了本书前面所介绍的一些例子或者以前曾经用过PHP,我们已经掌握了一些关于调试的技巧和技术。随着项目更加复杂,调试也变得更加困难。虽然技能提高了,但错误也可能牵涉到更多的文件,或者在多个程序员编写的代码之间相互作用。
在本章中,我们将主要介绍以下内容:
■编程语法,运行时以及逻辑错误
■出错信息
■错误级别
■触发自定义错误
■巧妙地处理错误
26.1 编程错误
无论使用什么语言进行编程,通常,都会遇到如下所示的3种错误类型:
■语法错误
■运行时错误
■逻辑错误
在开始讨论检查、处理、避免和解决错误的策略之前,我们先简要地介绍这3种类型。
26.1.1 语法错误
语言有一系列规则,称之为语法,语句只有符合语法才是有效的。自然语言(例如,英语)和编程语言(例如,PHP)都是如此。如果语句不符合这些语言规则,就被称为有语法错误。通常,语法错误在讨论解释性语言(例如,PHP)的时候,也经常称为解析错误;在讨论编译性语言(如C或Java语言)的时候也称为编译错误。
如果我们打破英语的语法规则,人们仍然很可能知道我们的意思是什么。但在编程语言中,情况就不是这样。如果脚本不遵守PHP的语法规则——也就是说,如果它含有语法错误——PHP解析器将不能处理其中的一部分或者全部。人们善于从片面或相互冲突的数据中推测出信息,但是计算机却不能。
在许多其他的规则中,PHP语法要求语句以分号结束,字符串包含在引号内,传给函数的参数用逗号分开并且包括在圆括号内。如果不遵守这些规则,PHP脚本就不可能正常工作,并在我们首次运行这些脚本的时候产生出错信息。
PHP的最大的一个优点就是在出错的时候会给出出错信息,而且其出错信息十分有用。通常,一个PHP出错信息将告诉我们出现了什么错误,在哪个文件出错,以及错误在哪一行。
如下所示的就是一个示例的出错信息:
Parse error:parse error,unexpected'''in
/home/book/public_html/phpmysql4e/chapter26/error.php on line 2
该错误由下列脚本产生:
<?php
$date=date(m.d.y');
?>
可以看到,我们试图将一个字符串传递给date函数,但是忘了在字符串开始前添加引号。
通常,这样的简单语法错误最容易发现。但是,我们可能还会产生一个类似的却更难发现的错误——忘记了字符串结束的后引号,例如:
<?php
$date=date('m.d.y);
?>
以上代码将产生如下所示的错误:
Parse error:parse error,unexpected$end in
/home/book/public_html/phpmysql4e/chapter26/error.php on line 2
很明显,脚本代码只有3行,错误不可能真的出现在第4行。当我们打开了什么,却没有将它关闭时出现的错误可能就会像上述错误信息一样。在使用单引号和双引号,以及使用不同形式的括号时,很容易遇到这个问题。
如下所示的脚本将产生类似的语法错误:
<?php
if(true){
echo'error here';
?>
如果是多个文件的组合产生的这些错误,那么它们就很难找出来。错误出现在一个大文件里也很难查找。当遇到一个1000行的文件出现了"parse error on line 1001"的错误,恐怕要花一天才能找出错误来。作为一个提醒,我们应该尽量编写模块化的代码。
然而一般来说,语法错误是最容易找出的错误类型。如果出现语法错误并且尝试执行一个代码块,PHP会给出错信息并告诉我们在哪里查找错误。