PHP 做了个美女猜拳输光衣游戏游戏 发现不对 请高手指点

PHP的错误和异常处理 - n哖苡逅 - 博客园
随笔 - 105, 文章 - 0, 评论 - 9, 引用 - 0
任何程序员在开发时都可能遇到过一些失误,或其他原因造成错误的发生。当然,用户如果不愿意或不遵循应用程序的约束,也会在使用时引起一些错误发生。PHP程序的错误发生一般归属于下列三个领域。
&O&&语法错误
语法错误最常见,并且最容易修复。例如,遗漏了一个分号,就会显示错误信息。这类错误会阻止脚本执行。通常发生在程序开发时,可以通过错误报告进行修复,再重新运行。
&O&&运行时错误
这种错误一般不会阻止PHP脚本的运行,但是会阻止脚本做希望它所做的任何事情。例如,在调用header()函数前如果有字符输出,PHP通常会显示一条错误消息,虽然PHP脚本继续运行,但header()函数并没有执行成功。
&O&&逻辑错误
这种错误实际上是最麻烦的,不但不会阻止PHP脚本的执行,也不会显示出错误消息。例如,在if语句中判断两个变量的值是否相等,如果错把比较运行符号&==&写成赋值运行符号&=&就是一种逻辑错误,很难会被发现。
一个异常则是在一个程序执行过程中出现的一个例外,或是一个事件,它中断了正常指令的运行,跳转到其他程序模块继续执行。所以异常处理经常被当做程序的控制流程使用。无论是错误还是异常,应用程序都必须能够以妥善的方式处理,并做出相应的反应,希望不要丢失数据或者导致程序崩溃。
10.1.1&&错误类型和基本的调试方法
运行PHP脚本时,PHP解析器会尽其所能地报告它遇到的问题。在PHP中错误报告的处理行为,都是通过PHP的配置文件php.ini中有关的配置指令确定的。另外PHP的错误报告有很多种级别,可以根据不同的错误报告级别提供对应的调试方法。一旦把PHP设置成呈现出发生了哪些错误,你可能想调整错误报告的级别。在表10-1中列出了PHP中大多数的错误报告级别。
表10-1&&PHP的错误报告级别
&DIV align=center&
错误报告描述
致命的运行时错误(它会阻止脚本的执行)
E_WARNING&
运行时警告(非致命的错误)
从语法中解析错误
运行时注意消息(可能是或者可能不是一个问题)
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&
用户导致的注意消息
所有的错误、警告和注意
关于PHP版本移植的兼容性和互操作性建议
如果用户希望在PHP脚本中,遇到上表中的某个级别的错误时,将错误消息报告给用户。则必须在配置文件php.ini中,将display_errors指令的值设置为On,开启PHP输出错误报告的功能。也可以在PHP脚本中调用ini_set()函数,动态设置配置文件php.ini中的某个指令。如果display_errors被启用,就会显示满足已设置的错误级别的所有错误。当用户在访问时,看到显示的这些消息不仅会感到迷惑,而且还可能会过多地泄露有关服务器的信息,使服务器变得很不安全。所以在项目开发或测试期间启用此指令,可以根据不同的错误报告更好的调试程序。出于安全性和美感的目的,让公众用户查看PHP的详细出错消息一般是不明智的,所以在网站投入使用时要将其禁用。
当你正在开发站点时,你将希望PHP报告特定类型的错误,可以通过调整错误报告的级别实现,可以通过以下两种方法设置错误报告级别。
&O&&可以通过在配置文件php.ini中,修改配置指令error_reporting的值,修改成功后重新启动Web服务器,则每个PHP脚本都可以按调整后的错误级别输出错误报告。下面是修改php.ini配置文件的示例,列出几种为error_reporting指令设置不同级别值的方式,可以把位运算符[&(与)、|(或)、~(非)]和错误级别常量一起使用。如下所示:
&DIV align=center&
;&可以抛出任何非注意的错误,默认值
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)
&O&&或者可以在PHP脚本中使用error_reporting()函数,基于各个脚本来调整这种行为。这个函数用于确定PHP应该在特定的页面内报告哪些类型的错误。该函数获取一个数字或上表中错误级别常量作为参数。如下所示:
&DIV align=center&
error_reporting(0);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&//设置为0会完全关闭错误报告
error_reporting (E_ALL);&&&&&&&&&&&&&&&&&&&&&&&&&&//将会向PHP报告发生的每个错误
error_reporting (E_ALL & ~E_NOTICE);&&&&&&&&&&&//可以抛出任何非注意的错误报告
在下面的示例中,我们在PHP脚本中分别创建出一个&注意&、一个&警告&和一个致命&错误&。并通过设置不同的错误级别,限制程序输出没有被允许的错误报告。创建一个名为error.php的脚本文件,代码如下所示:
&DIV align=center&
&&&&&&&&&&head&&title&测试错误报告&/title&&/head&
&&&&&&&&&&body&
&&&&&&&&&&&&&&&&&&&&h2&测试错误报告&/h2&
&&&&&&&&&&&&&&&&&&&&?php
&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*开启php.ini中的display_errors指令,只有该指令开启如果有错误报告才能输出*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&ini_set('display_errors',1);&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*通过error_reporting()函数设置在本脚本中,输出所有级别的错误报告*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&error_reporting(E_ALL);
&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&注意(notice)&的报告,不会阻止脚本的执行,并且可能不一定是一个问题&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&getType($var);&&&&&&&&&&&&&//调用函数时提供的参数变量没有在之前声明
&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&警告(warning)&的报告,指示一个问题,但是不会阻止脚本的执行&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&getType();&&&&&&&&&&&&&&&&&//调用函数时没有提供必要的参数
&&&&&&&&&&&&&&&&&&&&&&&&&&&&/*&错误(error)&的报告,它会终止程序,脚本不会再向下执行&*/
&&&&&&&&&&&&&&&&&&&&&&&&&&&&get_Type();&&&&&&&&&&&&&&&&//调用一个没有被定义的函数
&&&&&&&&&&&&&&&&&&&?&
&&&&&&&&&&/body&
在上面的脚本中,为了确保配置文件中的display_errors指令开启,通过ini_set()函数强制在该脚本执行中启动,并通过error_repoting()函数设置错误级别为E_ALL,报告所有错误、警告和注意。并在脚本中分别创建出注意、警告和错误,PHP脚本只有在遇到错误时才会终止运行,输出的错误报告结果如图10-1所示。
图输出错误报告结果的演示
&注意&和&警告&的错误报告并不会终止程序运行。如果在上面的输出结果中,不希望有注意和警告的报告输出,就可以在脚本中修改函数,修改的代码如下所示:
&DIV align=center&
报告除注意和警告之外的所有错误
脚本被修改以后并重新运行,在输出的结果中就只剩下一条错误报告了,如图所示。
图屏蔽&注意&和&警告&后的输出结果
除了使用和两个配置指令可以修改错误报告行为以外,还有许多配置指令可以确定的错误报告行为。其他的一些重要的指令如表所示。
表10-2&&确定PHP错误报告行为的配置指令
&DIV align=center&
是否显示引擎在初始化时遇到的所有错误
确定日志语句记录的位置
设置错误可以发送到中
每个日志项的最大长度,以字节为单位,设置表示指定最大长度
是否忽略同一文件、同一行发生的重复错误消息
忽略不同文件中或同一文件中不同行上发生的重复错误
启动该指令会使在中存储最近发生的错误信息
10.1.2&&错误日志
对于开发者来说,一旦某个产品投入使用,应该立即将选项关闭,以免因为这些错误所透露的路径、数据库连接、数据表等信息而遭到黑客攻击。但是,任何一个产品在投入使用后,都难免会有错误出现,那么如何记录一些对开发者有用的错误报告呢?我们可以在单独的文本文件中将错误报告作为日志记录。错误日志的记录,可以帮助开发人员或者管理人员查看系统是否存在问题。
如果需要将程序中的错误报告写入错误日志中,只要在的配置文件中,将配置指令开启即可。错误报告默认就会记录到服务器的日志文件里,例如记录到服务器的错误日志文件中。当然也可以记录错误日志到指定的文件中或发送给系统,分别介绍如下:
1.使用指定的文件记录错误报告日志
如果使用自己指定的文件记录错误日志,一定要确保将这个文件存放在文档根目录之外,以减少遭到攻击的可能。并且该文件一定要让脚本的执行用户(服务器进程所有者)具有写权限。假设在操作系统中,将目录下的文件作为错误日志文件,并设置服务器进程用户具有写的权限。然后在的配置文件中,将指令的值设置为这个错误日志文件的绝对路径。需要将中的配置指令做如下修改:
&DIV align=center&
将会向报告发生的每个错误
不显示满足上条指令所定义规则的所有错误报告
决定日志语句记录的位置
设置每个日志项的最大长度
指定产生的错误报告写入的日志文件位置
的配置文件按上面的方式设置完成以后,并重新启动服务器。这样,在执行的任何脚本文件时,所产生的所有错误报告都不会在浏览器中显示,而会记录在自己指定的错误日志中。此外,不仅可以记录满足所定义规则的所有错误,而且还可以使用中的函数,送出一个用户自定义的错误信息。该函数的原型如下所示:
&DIV align=center&
此函数会送出错误信息到服务器的错误日志文件、某个服务器或到指定文件中。该函数执行成功则返回,失败则返回。第一个参数是必选项,即为要送出的错误信息。如果仅使用这一个参数,会按配置文件中所设置的位置处发送消息。第二个参数为整数值:表示送到操作系统的日志中;则使用的函数,发送信息到某处,第四个参数亦会用到;则将错误信息送到服务器中,此时第三个参数表示目的地及;则将信息存到文件中。如果以登入数据库出现问题的处理为例,该函数的使用如下所示:
&DIV align=center&
数据库不可用将错误消息写入到操作系统日志中
出现大麻烦了发送到管理员邮箱中
搞砸了发送到本机对应端口的服务器中
搞砸了发送到指定的文件中
2.错误信息记录到操作系统的日志里
错误报告也可以被记录到操作系统日志里,但不同的操作系统之间的日志管理有点区别。在上错误语句将送往,而在上错误将发送到事件日志里。如果你不熟悉,起码要知道它是基于的日志工具,它提供了一个来记录与系统和应用程序执行有关的消息。事件日志实际上与的相同,这些日志通常可以通过事件查看器来查看。如果希望将错误报告写到操作系统的日志里,可以在配置文件中将指令的值设置为。具体需要在中修改的配置指令如下所示:
&DIV align=center&
将会向报告发生的每个错误
不显示满足上条指令所定义规则的所有错误报告
决定日志语句记录的位置
设置每个日志项的最大长度
指定产生的错误报告写入操作系统的日志里
除了一般的错误输出之外,还允许向系统中发送定制的消息。虽然通过前面介绍的函数,也可以向中发送定制的消息,但在中为这个特性提供了需要一起使用的个专用函数。分别介绍如下:
在使用、及三个函数之前必须先调用该函数。因为在调用该函数时,它会根据现在的系统环境为下面三个函数初使用化一些必需的常量。
打开一个和当前系统中日志器的连接,为向系统插入日志消息做好准备。并将提供的第一个字符串参数插入到每个日志消息中,该函数还需要指定两个将在日志上下文使用的参数,可以参考官方文档使用。
该函数向系统日志中发送一个定制消息。需要两个必选参数,第一个参数通过指定一个常量定制消息的优先级。例如表示一般的警告,表示严重地可以预示着系统崩溃的问题,一些其他的表示严重程度的常量可以参考官方文档使用。第二个参数则是向系统日志中发送的定制消息,需要提供一个消息字符串,也可以是引擎在运行时提供的错误字符串。
该函数在向系统日志中发送完成定制消息以后调用,关闭由函数打开的日志连接。
如果在配置文件中,已经开启向发送定制消息的指令,就可以使用前面介绍的四个函数发送一个警告消息到系统日志中,并通过系统中的解析工具,查看和分析由程序发送的定制消息,如下所示:
&DIV align=center&
警告报告向中发送的演示,警告时间:
以系统为例,通过右击&我的电脑&选择管理选项,然后到系统工具菜单中,选择事件查看器,再找到应用程序选项,就可以看到我们自己定制的警告消息了。上面这段代码将在系统的文件中,生成类似下面的一条信息,是事件的一部分:
&DIV align=center&
警告报告向中发送的演示,警告时间:
使用指定的文件还是使用记录错误日志,取决于你所在的服务器环境。如果你可以控制服务器,使用是最理想的,因为你能利用的解析工具来查看和分析日志。但如果你的网站在共享服务器的虚拟主机中运行,就只有使用单独的文本文件记录错误日志了。
10.1.3&&异常处理
异常(Exception)处理用于在指定的错误发生时改变脚本的正常流程,是PHP 5中的一个新的重要特性。异常处理是一种可扩展、易维护的错误处理统一机制,并提供了一种新的面向对象的错误处理方式。在Java、C#及Python等
语言中很早就提供了这种异常处理机制,如果你对哪一种语言中的异常处理熟悉,那对中提供的异常处理机制也不会陌生。
1.异常处理实现
异常处理和编写程序的流程控制相似,所以也可以通过异常处理实现一种另类的条件选择结构。异常就是在程序运行过程中出现的一些意料之外的事件,如果不对此事件进行处理,则程序在执行时遇到异常将崩溃。处理异常需要在脚本中使用以下语句:
&DIV align=center&
所有需要进行异常处理的代码都必须放入这个代码块内
在这里可以使用语句抛出一个异常对象
使用该代码块捕获一个异常,并进行处理
处理发生的异常,也可再次抛出异常
在代码中所产生的异常可以被语句抛出并被语句捕获。需要进行异常处理的代码都必须放入代码块内,以便捕获可能存在的异常。每一个至少要有一个与之对应的,也不能出现单独的,另外和之间也不能有任何的代码出现。一个异常处理的简单实例如下所示:
&DIV align=center&
创建一个异常对象,通过语句抛出
从这里开始,代码块内的代码将不会再被执行
输出捕获的异常消息
程序没有崩溃继续向下执行
在上面的代码中,如果代码块中出现某些错误,我们就可以执行一个抛出异常的操作。在某些编程语言中,例如,在出现异常时将自动抛出异常。而在中,异常必须手动抛出。关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但必须给它传递一个对象作为值。在最简单的情况下,可以实例化一个内置的类,就像以上代码所示那样。如果在语句中有异常对象被抛出,该代码块不会再继续向下执行,而直接跳转到中执行。并传递给代码块一个对象,也可以理解为被代码块捕获的对象,其实就是导致异常被语句抛出的对象。在代码块中可以简单的输出一些异常的原因,也可以是代码块中任务的另一个版本解决方案,此外,也可以在这个代码块中产生新的异常。最重要的是,在异常处理之后,程序不会崩溃,而会继续执行。
2.扩展PHP内置的异常处理类
在代码块中,需要使用语句抛出一个异常对象,才能跳转到代码块中执行,并在代码块中捕获并使用这个异常类的对象。虽然在中提供的内置异常处理类,已经具有非常不错的特性,但在某些情况下,可能还要扩展这个类来得到更多的功能。所以用户可以用自定义的异常处理类来扩展内置的异常处理类。以下的代码说明了在内置的异常处理类中,哪些属性和方法在子类中是可访问和可继承的:
内置的异常处理类(Exception)
&DIV align=center&
用户自定义异常代码
发生异常的文件名
发生异常的代码行号
返回异常信息
返回异常代码
返回发生异常的文件名
返回发生异常的代码行号
已格成化成字符串的信息
可重载的方法
可输出的字符串
上面这段代码只为说明内置异常处理类的结构,它并不是一段有实际意义的可用代码。如果使用自定义的类作为异常处理类,则必须是扩展内置异常处理类的子类,非类的子类是不能作为异常处理类使用的。如果在扩展内置处理类时重新定义构造函数的话,建议同时调用来检查所有的变量是否已被赋值。当对象要输出字符串的时候,可以重载并自定义输出的样式。可以在自定义的子类中,直接使用内置异常处理类中的所有成员属性,但不能重新改写从该父类中继承过来的成员方法,因为该类的大多数公有方法都是的。
创建自定义的异常处理程序非常简单,和传统类的声明方式相同,但该类必须是内置异常处理类的一个扩展。当中发生异常时,可调用自定义异常类中的方法进行处理。创建一个自定义的类,继承了内置异常处理类中的所有属性,并向其添加了自定义的方法。代码及应用如下所示:
扩展PHP内置的异常处理类的应用
&DIV align=center&
自定义的一个异常处理类,但必须是扩展内异常处理类的子类
重定义构造器使第一个参数变为必须被指定的属性
可以在这里定义一些自己的代码
建议同时调用来检查所有的变量是否已被赋值
重写父类方法,自定义字符串输出的样式
为这个异常自定义一个处理方法
按自定义的方法处理出现的这个类型的异常
使用自定义的异常类捕获一个异常,并处理异常
允许抛出这个错误
创建一个自定义的异常类对象,通过语句抛出
从这里开始,代码块内的代码将不会再被执行
捕获自定义的异常对象
捕获异常输出捕获的异常消息
通过自定义的异常对象中的方法处理异常
你好呀程序没有崩溃继续向下执行
在自定义的类中,使用父类中的构造方法检查所有的变量是否已被赋值。而且重载了父类中的方法,输出自己定制捕获的异常消息。自定义和内置的异常处理类,在使用上没有多大区别,只不过在自定义的异常处理类中,可以调用为具体的异常专门编写的处理方法。
3.捕获多个异常
在代码块之后,必须至少给出一个代码块,也可以将多个代码块与一个代码块进行关联。如果每个代码块可以捕获一个不同类型的异常,那么使用多个就可以捕获不同的类所产生的异常。当产生一个异常时,将查询一个匹配的代码块。如果有多个代码块,传递给每一个代码块的对象必须具有不同的类型,这样可以找到需要进入哪一个代码块。当代码块不再抛出异常或者找不到能匹配所抛出的异常时,代码就会在跳转到最后一个的后面继续执行。多个异常的捕获的示例如下:
内置的异常处理类(Exception)
&DIV align=center&
自定义的一个异常处理类,但必须是扩展内异常处理类的子类
重定义构造器使第一个参数变为必须被指定的属性
可以在这里定义一些自己的代码
建议同时调用来检查所有的变量是否已被赋值
重写父类中继承过来的方法,自定义字符串输出的样式
为这个异常自定义一个处理方法
按自定义的方法处理出现的这个类型的异常
创建一个用于测试自定义扩展的异常类
一个成员属性,用来判断对象是否创建成功被初始化
通过构造方法的传值决定抛出的异常
对传入的值进行选择性的判断
如果传入的参数值为,则抛出自定义的异常对象
传入的值&&是一个无效的参数
如果传入的参数值为,则抛出内置的异常对象
传入的值&&不允许作为一个参数
如果传入的参数值合法,则不抛出异常创建对象成功
为对象中的成员属性赋值
示例,在没有异常时,程序正常执行,中的代码全部执行并不会执行任何区块
使用默认参数创建异常的测试类对象
没有抛出异常这条语句就会正常执行
捕获用户自定义的异常区块
捕获自定义的异常:按自定义的方式输出异常消息
可以调用自定义的异常处理方法
捕获内置的异常处理类的对象
捕获默认的异常:输出异常消息
判断对象是否创建成功,如果没有任何异常,则创建成功
示例,抛出自定义的异常,并通过自定义的异常处理类捕获这个异常并处理
传入参数时,创建测试类对象抛出自定义异常

我要回帖

更多关于 c 猜拳游戏 的文章

 

随机推荐