文章教程

16.1在PHP中处理程序错误

9/17/2020 9:31:19 PM 人评论 次浏览

16.1 在PHP中处理程序错误

PHP中的程序异常通常有以下3种情况。

·语法错误。

·运行时错误。

·逻辑错误。

下面分3小节讲述这3种错误在PHP中应该如何检查、解决以及如何避免。

16.1.1 语法错误的处理

每种编程语言都有自己的一套编写规则,这些规则通常叫做语法,PHP也不例外。例如,PHP语言规定每个语句必须以分号结束,又如定义函数时必须使用关键字function,诸如此类都是PHP的语法内容。如果程序中的语句有不符合这些语法规则的地方,PHP分析器就会产生语法分析错误,导致程序执行失败或中断。计算机非常严格地按照PHP语法执行PHP脚本,任何语法错误都不能容忍,即便是在一个语句结束的地方少了一个分号。

常见的语法错误往往都是比较细小的地方,一般由粗心大意导致。比如,在一个语句末尾缺少分号,在一个字符串结束时没有单引号或双引号、括号不匹配等。通常这些问题会在PHP脚本执行时由PHP分析器输出到页面中。例如下面一小段有语法错误的PHP代码,执行时就会产生一个语法错误。


     <?php
     $str = 'this is a string;
     echo $str;
     ?>

这段代码执行时,会在浏览器页面上看到类似于下面的语法错误(Parse error)信息。


Parse error: parse error, unexpected $end in D:\Apache2\htdocs\webroot\ch16\test.php on line 4

这个错误信息表明这时一个语法分析错误parse error,并且给出错误原因是unexpected$end;同时还指出了错误文件及错误所在的行数D:\Apache2\htdocs\webroot\ch16\test.php on line 4。这个语法错误里的unexpected$end,可以解释为“意外的结束(符)$end”,之所以是unxepected,是因为程序里在第2行定义字符串时,少了字符串结束的单引号。PHP分析器所报告的错误在第4行,原因是PHP分析器从第2行开始,就一直“等待”字符串$str的结束符——单引号',直到第4行程序结尾,仍没有单引号来结束字符串,所以PHP分析器报告错误,认为字符串还没有结束,却在第4行结束了程序,这是意外的,所以报告错误在第4行。

注意  当碰到PHP分析器产生的错误时,不一定错误代码就在所报告的那一行,应该在前后代码中仔细查找语法错误。

如果读者在执行这一小段有语法错误的代码时没有看到任何报错信息,或者执行其他PHP脚本时,本应该有内容输出,看到的却是一个空白页面,那么很可能是由于PHP的配置文件php.ini中的display_errors项设置为了Off,请将该项设置为On,将PHP显示错误打开,然后重启Apache服务器即可。

16.1.2 运行时错误的处理

语法错误可以在PHP分析器执行脚本时检测到,而运行时错误就不那么简单了,下面通过实例来说明。比如有如下一段PHP代码。


     <?php
     $i = 10;
     $j = 0;
     $k = $i/$j;
     ?>

这段代码本身没有任何语法错误,但是,这段代码将0作为除数,所以会产生类似下面的警告(Warring)信息。


Warning: Division by zero in D:\Apache2\htdocs\webroot\ch16\test.php on line 4

又如如下代码。


     <?php
     $rest = find_something();
     ?>

这段代码调用一个不存在或者没有定义过的函数find_something(),会产生类似下面的致命错误(Fatal error)信息。


Fatal error: Call to undefined function find_something() in
D:\Apache2\htdocs\webroot\ch16\test.php on line 2

这段代码报告错误“Call to undefined function find_something()”的含义是调用了一个未定义的函数find_something()。

常见的运行时错误有以下几类。

·读写一个不存在或者无权限的文件。

·调用一个未定义的函数或传入函数的参数问题。

·连接数据库异常。

·没有获取到INPUT数据。

再举一个调用函数的运行时错误,代码如下。


     <?php
     $rest = substr();
     ?>

PHP预定义函数substr()至少应该传入两个参数,但这段代码调用函数substr()没有使用任何参数,这时会得到一个类似如下警告信息。这段警告信息指明,函数substr()参数数量错误。


Warning: Wrong parameter count for substr() in D:\Apache2\htdocs\webroot\ch16\test.php   on line 2

16.1.3 逻辑错误的处理

逻辑错误是一种比较难以发现和处理的错误。这种错误发生时并没有明显错误信息报告,因为程序都正常执行,只是最终结果(或在某种情况下的结果)并不是所期望的结果。例如如下示例代码。


     01 <?php
     02 for($i=0; $i<10; ++$i);
     03 {
     04     echo 'PHP';
     05 }
     06 ?>

【代码解析】这段程序本意是向页面输出10个字符串“PHP”,但实际的执行结果却只是输出了一个“PHP”。程序本身没有任何语法错误,运行也正常,输出了字符串“PHP”,但是没有循环输出更多的字符串“PHP”。原因就是在for循环结构后面加了一个分号,这个分号紧跟for循环,构成了一个空语句。因为for循环语句后紧跟的应该是循环体,这个分号使得PHP认为这个空语句就是for循环结构的循环体,所以循环了10次没有任何实际操作的空语句,最后执行花括号括住的echo语句输出一个字符串“PHP”。

提示 类似这样的逻辑错误在编写程序很难被发现,有时开发人员会认为一个逻辑没有错误,但实际的执行结果却不符合预期的结果。这就需要在编写程序中理清思路,考虑清楚程序执行的各种可能的情况等。一旦发现程序执行后没有得到预期结果,就需要仔细阅读程序,进一步查看代码和程序执行流程,找到逻辑出错的部分。

教程类别