代码常见的错误.docx

上传人:b****3 文档编号:4397821 上传时间:2023-05-07 格式:DOCX 页数:19 大小:34.23KB
下载 相关 举报
代码常见的错误.docx_第1页
第1页 / 共19页
代码常见的错误.docx_第2页
第2页 / 共19页
代码常见的错误.docx_第3页
第3页 / 共19页
代码常见的错误.docx_第4页
第4页 / 共19页
代码常见的错误.docx_第5页
第5页 / 共19页
代码常见的错误.docx_第6页
第6页 / 共19页
代码常见的错误.docx_第7页
第7页 / 共19页
代码常见的错误.docx_第8页
第8页 / 共19页
代码常见的错误.docx_第9页
第9页 / 共19页
代码常见的错误.docx_第10页
第10页 / 共19页
代码常见的错误.docx_第11页
第11页 / 共19页
代码常见的错误.docx_第12页
第12页 / 共19页
代码常见的错误.docx_第13页
第13页 / 共19页
代码常见的错误.docx_第14页
第14页 / 共19页
代码常见的错误.docx_第15页
第15页 / 共19页
代码常见的错误.docx_第16页
第16页 / 共19页
代码常见的错误.docx_第17页
第17页 / 共19页
代码常见的错误.docx_第18页
第18页 / 共19页
代码常见的错误.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

代码常见的错误.docx

《代码常见的错误.docx》由会员分享,可在线阅读,更多相关《代码常见的错误.docx(19页珍藏版)》请在冰点文库上搜索。

代码常见的错误.docx

代码常见的错误

PHP的错误和异常处理

任何程序员在开发时都可能遇到过一些失误,或其他原因造成错误的发生。

当然,用户如果不愿意或不遵循应用程序的约束,也会在使用时引起一些错误发生。

PHP程序的错误发生一般归属于下列三个领域。

Ø  语法错误

语法错误最常见,并且最容易修复。

例如,遗漏了一个分号,就会显示错误信息。

这类错误会阻止脚本执行。

通常发生在程序开发时,可以通过错误报告进行修复,再重新运行。

Ø  运行时错误

这种错误一般不会阻止PHP脚本的运行,但是会阻止脚本做希望它所做的任何事情。

例如,在调用header()函数前如果有字符输出,PHP通常会显示一条错误消息,虽然PHP脚本继续运行,但header()函数并没有执行成功。

Ø  逻辑错误

这种错误实际上是最麻烦的,不但不会阻止PHP脚本的执行,也不会显示出错误消息。

例如,在if语句中判断两个变量的值是否相等,如果错把比较运行符号“==”写成赋值运行符号“=”就是一种逻辑错误,很难会被发现。

一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行。

所以异常处理经常被当做程序的控制流程使用。

无论是错误还是异常,应用程序都必须能够以妥善的方式处理,并做出相应的反应,希望不要丢失数据或者导致程序崩溃。

10.1.1  错误类型和基本的调试方法

运行PHP脚本时,PHP解析器会尽其所能地报告它遇到的问题。

在PHP中错误报告的处理行为,都是通过PHP的配置文件php.ini中有关的配置指令确定的。

另外PHP的错误报告有很多种级别,可以根据不同的错误报告级别提供对应的调试方法。

一旦把PHP设置成呈现出发生了哪些错误,你可能想调整错误报告的级别。

在表10-1中列出了PHP中大多数的错误报告级别。

表10-1  PHP的错误报告级别

级别常量

错误报告描述

E_ERROR 

致命的运行时错误(它会阻止脚本的执行)

E_WARNING 

运行时警告(非致命的错误)

E_PARSE 

从语法中解析错误

E_NOTICE 

运行时注意消息(可能是或者可能不是一个问题)

E_CORE_ERROR 

类似E_ERROR,但不包括PHP核心造成的错误

E_CORE_WARNING 

类似E_WARNING,但不包括PHP核心错误警告

E_COMPILE_ERROR 

致命的编译时错误

E_COMPILE_WARNING 

致命的编译时警告

E_USER_ERROR 

用户导致的错误消息

E_USER_WARNING 

用户导致的警告

E_USER_NOTICE 

用户导致的注意消息

E_ALL 

所有的错误、警告和注意

E_STRICT

关于PHP版本移植的兼容性和互操作性建议

如果用户希望在PHP脚本中,遇到上表中的某个级别的错误时,将错误消息报告给用户。

则必须在配置文件php.ini中,将display_errors指令的值设置为On,开启PHP输出错误报告的功能。

也可以在PHP脚本中调用ini_set()函数,动态设置配置文件php.ini中的某个指令。

如果display_errors被启用,就会显示满足已设置的错误级别的所有错误。

当用户在访问时,看到显示的这些消息不仅会感到迷惑,而且还可能会过多地泄露有关服务器的信息,使服务器变得很不安全。

所以在项目开发或测试期间启用此指令,可以根据不同的错误报告更好的调试程序。

出于安全性和美感的目的,让公众用户查看PHP的详细出错消息一般是不明智的,所以在网站投入使用时要将其禁用。

当你正在开发站点时,你将希望PHP报告特定类型的错误,可以通过调整错误报告的级别实现,可以通过以下两种方法设置错误报告级别。

Ø  可以通过在配置文件php.ini中,修改配置指令error_reporting的值,修改成功后重新启动Web服务器,则每个PHP脚本都可以按调整后的错误级别输出错误报告。

下面是修改php.ini配置文件的示例,列出几种为error_reporting指令设置不同级别值的方式,可以把位运算符[&(与)、|(或)、~(非)]和错误级别常量一起使用。

如下所示:

; 可以抛出任何非注意的错误,默认值

error_reporting=E_ALL&~E_NOTICE

; 只考虑致命的运行时错误、解析错误和核心错误

;error_reporting=E_ERROR|E_PARSE|E_CORE_ERROR

; 报告除用户导致的错误之外的所有错误

;error_reporting=E_ALL&~(E_USER_ERROR|E_USER_WARNING|E_USER_NOTICE)

Ø  或者可以在PHP脚本中使用error_reporting()函数,基于各个脚本来调整这种行为。

这个函数用于确定PHP应该在特定的页面内报告哪些类型的错误。

该函数获取一个数字或上表中错误级别常量作为参数。

如下所示:

error_reporting(0);                                 //设置为0会完全关闭错误报告

error_reporting(E_ALL);                          //将会向PHP报告发生的每个错误

error_reporting(E_ALL&~E_NOTICE);           //可以抛出任何非注意的错误报告

在下面的示例中,我们在PHP脚本中分别创建出一个“注意”、一个“警告”和一个致命“错误”。

并通过设置不同的错误级别,限制程序输出没有被允许的错误报告。

创建一个名为error.php的脚本文件,代码如下所示:

         测试错误报告

         

                   

测试错误报告

                   

php

                            /*开启php.ini中的display_errors指令,只有该指令开启如果有错误报告才能输出*/

                            ini_set('display_errors',1); 

                            /*通过error_reporting()函数设置在本脚本中,输出所有级别的错误报告*/

                            error_reporting(E_ALL);

                            /*“注意(notice)”的报告,不会阻止脚本的执行,并且可能不一定是一个问题 */

                            getType($var);             //调用函数时提供的参数变量没有在之前声明

                            /*“警告(warning)”的报告,指示一个问题,但是不会阻止脚本的执行 */

                            getType();                 //调用函数时没有提供必要的参数

                            /*“错误(error)”的报告,它会终止程序,脚本不会再向下执行 */

                            get_Type();                //调用一个没有被定义的函数

                   ?

>

         

在上面的脚本中,为了确保配置文件中的display_errors指令开启,通过ini_set()函数强制在该脚本执行中启动,并通过error_repoting()函数设置错误级别为E_ALL,报告所有错误、警告和注意。

并在脚本中分别创建出注意、警告和错误,PHP脚本只有在遇到错误时才会终止运行,输出的错误报告结果如图10-1所示。

 

图10-1  输出错误报告结果的演示

“注意”和“警告”的错误报告并不会终止程序运行。

如果在上面的输出结果中,不希望有注意和警告的报告输出,就可以在脚本error.php中修改error_repoting()函数,修改的代码如下所示:

error_reporting(E_ALL&~(E_WARNING|E_NOTICE));        //报告除注意和警告之外的所有错误

脚本error.php被修改以后并重新运行,在输出的结果中就只剩下一条错误报告了,如图10-2所示。

 

图10-2  屏蔽“注意”和“警告”后的输出结果

除了使用error_reporting和display_error两个配置指令可以修改错误报告行为以外,还有许多配置指令可以确定PHP的错误报告行为。

其他的一些重要的指令如表10-2所示。

表10-2  确定PHP错误报告行为的配置指令

配置指令

描    述

默认值

display_startup_errors

是否显示PHP引擎在初始化时遇到的所有错误

Off

log_errors

确定日志语句记录的位置

Off

error_log

设置错误可以发送到syslog中

Null

log_errors_max_len

每个日志项的最大长度,以字节为单位,设置0表示指定最大长度

1024

ignore_repeated_errors

是否忽略同一文件、同一行发生的重复错误消息

Off

ignore_repeated_source

忽略不同文件中或同一文件中不同行上发生的重复错误

Off

track_errors

启动该指令会使PHP在$php_errormsg中存储最近发生的错误信息

Off

10.1.2  错误日志

对于PHP开发者来说,一旦某个产品投入使用,应该立即将display_errors选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。

但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?

我们可以在单独的文本文件中将错误报告作为日志记录。

错误日志的记录,可以帮助开发人员或者管理人员查看系统是否存在问题。

如果需要将程序中的错误报告写入错误日志中,只要在PHP的配置文件中,将配置指令log_errors开启即可。

错误报告默认就会记录到Web服务器的日志文件里,例如记录到Apache服务器的错误日志文件error.log中。

当然也可以记录错误日志到指定的文件中或发送给系统syslog,分别介绍如下:

1.使用指定的文件记录错误报告日志

如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。

并且该文件一定要让PHP脚本的执行用户(Web服务器进程所有者)具有写权限。

假设在Linux操作系统中,将/usr/local/目录下的error.log文件作为错误日志文件,并设置Web服务器进程用户具有写的权限。

然后在PHP的配置文件中,将error_log指令的值设置为这个错误日志文件的绝对路径。

需要将php.ini中的配置指令做如下修改:

error_reporting  =  E_ALL                        ;将会向PHP报告发生的每个错误

display_errors=Off                            ;不显示满足上条指令所定义规则的所有错误报告

log_errors=On                                ;决定日志语句记录的位置

log_errors_max_len=1024                        ;设置每个日志项的最大长度

error_log=/usr/local/error.log                      ;指定产生的错误报告写入的日志文件位置

PHP的配置文件按上面的方式设置完成以后,并重新启动Web服务器。

这样,在执行PHP的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志/usr/local/error.log中。

此外,不仅可以记录满足error_reporting所定义规则的所有错误,而且还可以使用PHP中的error_log()函数,送出一个用户自定义的错误信息。

该函数的原型如下所示:

boolerror_log(stringmessage[,intmessage_type[,stringdestination[,stringextra_headers]]])

此函数会送出错误信息到Web服务器的错误日志文件、某个TCP服务器或到指定文件中。

该函数执行成功则返回TRUE,失败则返回FALSE。

第一个参数message 是必选项,即为要送出的错误信息。

如果仅使用这一个参数,会按配置文件php.ini中所设置的位置处发送消息。

第二个参数message_type为整数值:

0表示送到操作系统的日志中;1则使用PHP的Mail()函数,发送信息到某E-mail处,第四个参数extra_headers亦会用到;2则将错误信息送到TCP 服务器中,此时第三个参数destination表示目的地IP及Port;3则将信息存到文件destination中。

如果以登入Oracle数据库出现问题的处理为例,该函数的使用如下所示:

php  

         if(!

Ora_Logon($username,$password)){  

                   error_log("Oracle数据库不可用!

",0);               //将错误消息写入到操作系统日志中

         }

         if(!

($foo=allocate_new_foo()){

                   error_log("出现大麻烦了!

",1,"webmaster@");   //发送到管理员邮箱中

         }

         error_log("搞砸了!

",   2,   "localhost:

5000");            //发送到本机对应5000端口的服务器中

         error_log("搞砸了!

",   3,   "/usr/local/errors.log");        //发送到指定的文件中

?

2.错误信息记录到操作系统的日志里

错误报告也可以被记录到操作系统日志里,但不同的操作系统之间的日志管理有点区别。

在Linux上错误语句将送往syslog,而在Windows上错误将发送到事件日志里。

如果你不熟悉syslog,起码要知道它是基于UNIX的日志工具,它提供了一个API来记录与系统和应用程序执行有关的消息。

Windows事件日志实际上与UNIX的syslog相同,这些日志通常可以通过事件查看器来查看。

如果希望将错误报告写到操作系统的日志里,可以在配置文件中将error_log指令的值设置为syslog。

具体需要在php.ini中修改的配置指令如下所示:

error_reporting  =  E_ALL                      ;将会向PHP报告发生的每个错误

display_errors=Off                                   ;不显示满足上条指令所定义规则的所有错误报告

log_errors=On                               ;决定日志语句记录的位置

log_errors_max_len=1024                      ;设置每个日志项的最大长度

error_log=syslog                             ;指定产生的错误报告写入操作系统的日志里

除了一般的错误输出之外,PHP还允许向系统syslog中发送定制的消息。

虽然通过前面介绍的error_log()函数,也可以向syslog中发送定制的消息,但在PHP中为这个特性提供了需要一起使用的4个专用函数。

分别介绍如下:

 

Ø  define_syslog_variables()

在使用openlog()、syslog及closelog()三个函数之前必须先调用该函数。

因为在调用该函数时,它会根据现在的系统环境为下面三个函数初使用化一些必需的常量。

Ø  openlog()

打开一个和当前系统中日志器的连接,为向系统插入日志消息做好准备。

并将提供的第一个字符串参数插入到每个日志消息中,该函数还需要指定两个将在日志上下文使用的参数,可以参考官方文档使用。

Ø  syslog()

该函数向系统日志中发送一个定制消息。

需要两个必选参数,第一个参数通过指定一个常量定制消息的优先级。

例如LOG_WARNING表示一般的警告,LOG_EMERG表示严重地可以预示着系统崩溃的问题,一些其他的表示严重程度的常量可以参考官方文档使用。

第二个参数则是向系统日志中发送的定制消息,需要提供一个消息字符串,也可以是PHP引擎在运行时提供的错误字符串。

Ø  closelog()

该函数在向系统日志中发送完成定制消息以后调用,关闭由openlog()函数打开的日志连接。

如果在配置文件中,已经开启向syslog发送定制消息的指令,就可以使用前面介绍的四个函数发送一个警告消息到系统日志中,并通过系统中的syslog解析工具,查看和分析由PHP程序发送的定制消息,如下所示:

php

         define_syslog_variables();

         openlog("PHP5",LOG_PID,LOG_USER);

         syslog(LOG_WARNING,"警告报告向syslog中发送的演示,警告时间:

".date("Y/m/dH:

i:

s"));

         closelog();

?

>

以Windows系统为例,通过右击“我的电脑”选择管理选项,然后到系统工具菜单中,选择事件查看器,再找到应用程序选项,就可以看到我们自己定制的警告消息了。

上面这段代码将在系统的syslog文件中,生成类似下面的一条信息,是事件的一部分:

PHP5[3084], 警告报告向syslog中发送的演示,警告时间:

2009/03/2604:

09:

11.

使用指定的文件还是使用syslog记录错误日志,取决于你所在的Web服务器环境。

如果你可以控制Web服务器,使用syslog是最理想的,因为你能利用syslog的解析工具来查看和分析日志。

但如果你的网站在共享服务器的虚拟主机中运行,就只有使用单独的文本文件记录错误日志了。

10.1.3  异常处理

异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程,是PHP5中的一个新的重要特性。

异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。

在Java、C#及Python等

语言中很早就提供了这种异常处理机制,如果你对哪一种语言中的异常处理熟悉,那对PHP中提供的异常处理机制也不会陌生。

1.异常处理实现

异常处理和编写程序的流程控制相似,所以也可以通过异常处理实现一种另类的条件选择结构。

异常就是在程序运行过程中出现的一些意料之外的事件,如果不对此事件进行处理,则程序在执行时遇到异常将崩溃。

处理异常需要在PHP脚本中使用以下语句:

try{                     //所有需要进行异常处理的代码都必须放入这个代码块内

   ……                  //在这里可以使用throw语句抛出一个异常对象

}catch(ex1){               //使用该代码块捕获一个异常,并进行处理

   ……                 //处理发生的异常,也可再次抛出异常

}

在PHP代码中所产生的异常可以被throw语句抛出并被catch语句捕获。

需要进行异常处理的代码都必须放入try代码块内,以便捕获可能存在的异常。

每一个try至少要有一个与之对应的catch,也不能出现单独的catch,另外try和cache之间也不能有任何的代码出现。

一个异常处理的简单实例如下所示:

php

         try{

                   $error='Alwaysthrowthiserror';

                   thrownewException($error);      //创建一个异常对象,通过throw语句抛出

                   echo'Neverexecuted';            //从这里开始,try代码块内的代码将不会再被执行

         }catch(Exception$e){

                   echo'Caughtexception:

',  $e->getMessage(),"\n";  //输出捕获的异常消息

         }

         echo'HelloWorld';                    //程序没有崩溃继续向下执行

?

>

在上面的代码中,如果try代码块中出现某些错误,我们就可以执行一个抛出异常的操作。

在某些编程语言中,例如Java,在出现异常时将自动抛出异常。

而在PHP中,异常必须手动抛出。

throw关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但必须给它传递一个对象作为值。

在最简单的情况下,可以实例化一个内置的Exception类,就像以上代码所示那样。

如果在try语句中有异常对象被抛出,该代码块不会再继续向下执行,而直接跳转到catch中执行。

并传递给catch代码块一个对象,也可以理解为被catch代码块捕获的对象,其实就是导致异常被throw语句抛出的对象。

在catch代码块中可以简单的输出一些异常的原因,也可以是try代码块中任务的另一个版本解决方案,此外,也可以在这个catch代码块中产生新的异常。

最重要的是,在异常处理之后,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2