您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 第8章 错误、异常处理与调试
y114y第8章错误、异常处理与调试在程序开发中,难免会因为某种原因而产生错误。如何去避免、调试、修复错误并对程序可能发生的异常进行处理是一个程序员必备的能力。PHP提供了良好的错误提示,在进行程序调试时可根据提示信息对错误进行排除。本章主要内容如下。PHP错误。异常处理。程序调试。通过对本章的学习,读者将对PHP中出现的错误有一个新的认识,并能够正确地理解并避免这些错误,避免程序可能出现的异常,出现错误时能够根据PHP的提示信息排除错误。8.1PHP错误类型在PHP程序开发中,通常会出现以下5种错误。语法错误:在程序中使用了错误的语法而导致的错误。语义错误:在程序中正确地使用了PHP的语法,但是没有任何意义,程序达不到预想的效果。逻辑错误:在程序中使用的逻辑与实际上需要的逻辑不符。注释错误:在程序中写的注释与该程序代码的意义不符。运行错误:由于运行环境等原因而导致的错误。在这几种错误中,除昀后一种是由于PHP所运行的环境原因等造成的以外,前面的4种均是由程序开发人员造成的,因而这4种错误应该在程序开发中尽量避免。8.1.1语法错误每一种语言都有属于自己的语法。在程序开发中如果使用了错误的语法,就会导致一个语法错误。【示例8-1】语法错误的示例。代码如下所示。?php$num_1=101;$num_2=202;$num_3=$num_1-/$num_2;//使用了错误的语法第8章错误、异常处理与调试y115yecho$num_3;?分析:在上述程序中,本来是将变量num_1减去变量num_2的差赋给变量num_3,但是因为第4行输入错误而产生了一个错误,PHP在解析这条语句时认为是错误的,便会抛出如下错误信息。Parseerror:syntaxerror,unexpected'/'inD:\xampplite\htdocs\book\source\8\8.1.phponline4该错误为解析错误,具体为脚本文件第4行出现了不可预知的“/”符号而产生的语法错误。读者在看到该错误信息时,可直接检查该行程序,一般情况下,错误就发生在该行。8.1.2语义错误语义错误是在使用了正确语法的基础上,使用了错误的格式而导致的。【示例8-2】语义错误的示例。代码如下所示。?php$str_1=Hello;$str_2=World.;$str_3=$str_1+$str_2;//使用了错误的字符串连接符echo$str_3;?分析:在上述程序中,程序本意是想将两个字符串连接起来,但是程序第4行却错误地使用了“+”作为字符连接符。因为PHP能够自动进行隐式变量类型转换,PHP在解析以上代码时认为它是符合PHP的语法的,并不会提示出错。8.1.3逻辑错误逻辑错误对于PHP来讲不是错误,因为语法、语义上没有任何问题。但是因为程序代码存在着逻辑着问题,进而导致程序得不到所期望的结果。【示例8-3】逻辑错误的示例。代码如下所示。?php$score=80;if($score80){//判断分数echo良好.;}else{echo中等.;}?分析:在上述程序中,程序本身从语法上和语义上讲都没有任何问题,并且能够得到结果。但是程序逻辑有问题,本来应该是80分及其以上为良好,以下为中等,但是程序的结果却是80分为中等,这就产生了逻辑错误。这种错误在开发时应尽量避免。PHP从入门到精通y116y8.1.4注释错误注释对于程序来讲是必不可少的。因为在分布式开发中,随时都有可能去读其他程序员的代码,如果没有注释,将会花费大量的时间读懂别人的代码。另外对于后期的维护也是相当困难的。对于注释错误,比没有更加可怕,因为开发人员往往会只看注释不会再花时间去看代码。【示例8-4】重写【示例8-3】,构成了一个注释错误。代码如下所示。?php$score=80;if($score=80){//大于80分的为良好echo良好.;}else{echo中等.;}?分析:在上述程序中,显示注释和程序本身的逻辑不统一,程序的逻辑是大于等于80分的为良好,而注释却只是大于80分为良好。虽然注释错误对于程序本没有任何影响,但是却影响到以后对代码的维护与修改。8.1.5运行错误运行错误与程序代码无关,它是由脚本运行的环境等因素造成的。比如在Linux系统中,文件权限不对等而引发的错误。【示例8-5】因文件不存在而引发的运行错误。代码如下所示。?php$filename=something.txt;//定义文件位置$handle=fopen($filename,r);//打开文件$contents=fread($handle,filesize($filename));//读取文件内容print$contents;//输出文件内容fclose($handle);//关闭文件?分析:在上述程序中,打开一个文本文件,读取其内容并将内容输出。但是由于当前工作目录下没有指定的文件,因而引发一个运行错误。其结果如下所示。Warning:fopen(something.txt)[function.fopen]:failedtoopenstream:NosuchfileordirectoryinD:\xampplite\htdocs\book\source\8\8.5.phponline3Warning:filesize()[function.filesize]:statfailedforsomething.txtinD:\xampplite\htdocs\book\source\8\8.5.phponline4Warning:fread():suppliedargumentisnotavalidstreamresourceinD:\xampplite\htdocs\book\source\8\8.5.phponline4Warning:fclose():suppliedargumentisnotavalidstreamresourceinD:\xampplite\htdocs\book\source\8\8.5.phponline6第8章错误、异常处理与调试y117y8.2错误处理不管是程序引发的错误,还是环境因素引发的错误,默认情况下,PHP都会给出提示信息。这些提示信息包含有服务器的运行环境信息。在实际的Web环境中,将这些信息显示出来,必然给服务器带来安全隐患。因此,必须对可能出现的错误进行相应的处理。8.2.1错误级别PHP中的错误是通过一个错误级别来进行划分的。从昀基本的通告到昀严重的错误,错误级别标识着所产生的错误的严重性。错误级别包含以下几种。E_ERROR:这是一个严重错误,不可恢复,如位置异常、内存不足等。E_WARNING:警告,昀一般的错误,如函数的参数错误等。E_PARSE:解析错误,在解析PHP文件时产生,并强制PHP在执行前退出。E_STRICT:这个错误级别是唯一不包含在E_ALL常量中的,主要是为了便于兼容PHP的低版本。E_NOTICE:通告表示可能在操作一些未知的变量等。在开发时可开启通告,以保证程序是“通告安全”的;而在正式系统中,应关闭通告。E_CORE_ERROE:这个内部错误是由于PHP加载扩展失败而导致的,并且会导致PHP停止运行并退出。E_COMPILE_ERROR:编译错误是在编译时发生,这个错误将导致PHP运行退出。E_COMPILE_WARNING:编译警告用于告诉用户一些不推荐的语法信息。E_USER_ERROR:用户定义的错误将导致PHP退出执行。它不是来自PHP本身,而是来自脚本文件中。E_USER_WARNING:脚本使用它来通知一个执行失败,同时PHP也会用E_WARNING通知。E_USER_NOTICE:用户定义的通告用于在脚本中表示可能存在的错误。8.2.2php.ini对错误处理的设置在前面的章节中曾讲到了php.ini文件,PHP的环境几乎都是在这个文件中进行设置。这里有两项关于错误处理的设置:一个是display_errors,一个是error_reporting。前一变量是用来告诉PHP是否显示错误,它的默认值为Off,即不显示错误信息,如果设置为true,将显示错误信息。后一变量是告知PHP如何显示提示信息,默认值为E_ALL&~E_NOTICE,即显示除注意信息外的所有提示信息。对于在开发环境,为了便于程序的调试,可将php.ini的相应项改成如下值。display_errors=Onerror_reporting=E_ALL&~E_NOTICEPHP从入门到精通y118y对于实际的Web环境,可将相应项设为如下值。display_errors=Offerror_reporting=E_ALL修改以后,重启apache服务器即可。除了可在php.ini文件进行设置以外,还可以在程序开头使用error_reporting()函数进行设置。该函数的参数与php.ini文件中的一样。技巧:为了让程序能够更好地移植,尽量在程序中对错误信息进行设置。【示例8-6】演示了当出现错误时,如何显示错误。代码如下所示。?php$str_1=thisisastring.;echo$str_1;error_reporting(E_ALL);//显示所有信息prinr($str_1);//输入错误?分析:在上述程序中,因输入错误,误将print输入为prinr,PHP在解析程序时将会报错,并给出相应的错误提示信息。程序运行结果如下。thisisastring.Fatalerror:Calltoundefinedfunctionpriny()inD:\xampplite\htdocs\book\source\8\8.6.phponline58.2.3错误处理在程序中,因各种原因可能导致的错误,PHP都会给出相应的提示信息。而对于错误信息的处理,除了可采用在php.ini文件中进行设置的方法外,还可以直接在程序中进行设置。1.错误信息的隐藏对于将整个系统可能产生的错误信息进行隐藏,可采用error_reporting()函数进行设置。【示例8-7】重写【示例8-5】,演示了如何隐藏所有错误信息。代码如下所示。?phperror_reporting(0);//隐藏所有提示信息$filename=something.txt;$handle=fopen($filename,r);//打开文本文件$contents=fread($handle,filesize($filename));//读取文本文件内容print$contents;fclose($handle);//关闭文件?分析:在上述程序中,因不存在指定的文本文件,程序应像【示例8-5】一样给出相应的错误提示信息。但是由于在第二行采用了error_reporting(0)函数隐藏了所有提示信息,因此就算没有当前工作目录没有该指定的文本文件,程序也不会显示出错信息。对于单条语句可能产生的错误信息的隐藏,可采用在语句前加“@”符号进行隐藏。【示例8-8】采用“@”符号隐藏单条语句可能产生的错误。代码如下所示。?php$filename=something.txt;第8章错误、异常处理与调试y119y$handle=@fopen($filename,r);//打开给定的文本文件$contents=@fread($handle,filesize($filename));//读取文件内容print$contents;//输出文件内容fclose($handle);//关闭文件?分析:在上述程序中,因不存在该指定文件,应像【示例8-5】一样给出相应的错误提示信息。但由于在第3行和第4行语句的前面添加了“@”符号,该行产生错误信息将不会被显示。而倒数第2行因没有添加“@”符号隐藏可能产生的错误信息,程序将可能显示出错信息。程序运行结果如下。Warning:fclose():suppliedargumentisnotavalidstr
本文标题:第8章 错误、异常处理与调试
链接地址:https://www.777doc.com/doc-3404837 .html