资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,PHP中的错误信息,php.ini中配置错误消息,php中错误消息处理,php代码中调整错误级别,自定义错误处理,PHP5中的SPL模块,什么是SPL,spl.php中的异常处理类,spl.php中的其它异常类,PHP5异常捕获,异常实例,抛出异常,在代码中捕获异常,在代码中捕获异常(2),一个catch块处理多种异常,多个catch块处理异常,异常处理块嵌套,异常向外抛出,PHP中的错误信息,1,PHP5自定义异常,自定义异常,异常处理实例,验证实例,验证实例代码,PHP5自定义异常,2,PHP,中的错误信息,php.ini,中配置错误消息,在PHP4中,没有异常,Exception,这个概念,只有 错误,Error,。我们可以通过修改php.ini 文件来配置用户端输出的错误信息。,在php.ini 中,一个分号 ; 表示注释。,Php.ini 将能够显示的错误类型分为如下种类,PHP中的错误信息 php.ini中配置错误消息,3,php教程_php面向对象(5)汇总ppt课件,4,在php.ini 中error_reporting 控制输出到用户端的消息种类。,以下几种是php.ini 中推荐的几种配置。,error_reporting = E_ALL,表示输出所有的信息。,error_reporting = E_ALL & E_NOTICE 表示输出所有的错误,除了提示。,error_reporting = E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR,表示输出所有的 ERROR 信息。,在php.ini 中error_reporting 控制输出,5,在php.ini 中,display_errors可以设置是否将以上设置的错误信息输出到用户端。,display_errors = On 输出到用户端(调试代码时候,打开这项更方便),display_errors = OFF 消息将不会输出到用户端(最终发布给用户时记得改成off),在php.ini 中,display_errors可以设置是,6,php,中错误消息处理,在php中,对于错误处理非常的宽松。php系统会尽量让程序运行下去,除非遇到致命错误。,php中错误消息处理 在php中,对于错误处理非常的宽松。p,7,再次提示:如果不想显示错误信息给用户看到,设置,php.ini,中,display_errors = OFF,再次提示:如果不想显示错误信息给用户看到,设置php.ini,8,php,代码中调整错误级别,除了在php.ini文件中可以调整错误消息的显示级别外,在php代码中也可以自定义消息显示的级别。,PHP提供了一个方便的调整函数。,int error_reporting ( int level ),使用这个函数可以定义当前php页面中错误消息的显示级别。,参数level使用了二进制掩码组合的方式。,php代码中调整错误级别 除了在php.ini文件中可以调整,9,php教程_php面向对象(5)汇总ppt课件,10,自定义错误处理,在php中,可以自定义对错误处理的方式。,首先要自定义一个错误处理函数,然后使用,set_error_handler(),函数向系统声明错误处理函数。代码中产生的错误就会使用这个错误处理函数了。,使用trigger_error()函数,可以触发一个error。,例如trigger_error(age you input must = 0, E_USER_ERROR),触发自己的错误信息。,自定义错误处理 在php中,可以自定义对错误处理的方式。,11,?php,function myErrorHandler($errno, $errstr, $errfile, $errline),switch ($errno) ,case E_USER_ERROR:,echo My ERROR $errno $errstrn;,echo Fatal error in line $errline of file $errfile;,echo , PHP . PHP_VERSION . ( . PHP_OS . )n;,echo Aborting.n; exit(1);,break;,case E_USER_WARNING:,echo My WARNING $errno $errstrn;,break;,case E_USER_NOTICE:,echo My NOTICE $errno $errstrn;,break;,default:,echo Unknown error type: $errno $errstrn;,break;,set_error_handler(myErrorHandler); /定义错误处理函数.,$age = -100; /假设出现了负数的年龄,这明显是错误的。,if ($age = 0”, E_USER_ERROR); /触发错误;,?,message = $message;,$this-code = $code; /错误代码默认是0;,$this-file = _FILE_; / 文件名,$this-line = _LINE_; / 行号,$this-trace = debug_backtrace(); /返回一个包含多个元素,$this-string = StringFormat($this); /格式化字符串,构造函数如下:,16,其中还包含了_clone() 方法和对应这些属性的geter方法。,其中还包含了_clone() 方法和对应这些属性的gete,17,spl.php,中的其它异常类,在SPL中还定义了其它的异常类,以对应不同的异常类型。这些异常类都是Exception类的子类。,在Exception类有两个直接子类 LogicException 和 RuntimeException,分别表示逻辑异常和执行异常。,spl.php中的其它异常类 在SPL中还定义了其它的异常类,18,php教程_php面向对象(5)汇总ppt课件,19,LogicException又衍生出其它的逻辑异常子类。,LogicException又衍生出其它的逻辑异常子类。,20,class LogicException extends Exception,程序中的逻辑错误的异常类,它是Exception类的直接子类。,class BadFunctionCallException extends LogicException,当不合法的函数被调用产生的异常类。,class BadMethodCallException extends BadFunctionCallException,当不合法的方法被调用产生的异常类。,class DomainException extends LogicException,表示一个值不在有效范围内的异常。,class InvalidArgumentException extends LogicException,表示传递了无效的参数产生的异常。,class LengthException extends LogicException,表示一个参数超过了许可的长度的异常。,class OutOfRangeException extends LogicException,表示请求检索超越了数组等容器最大长度的异常。,class LogicException extends E,21,RuntimeException衍生出其它运行异常子类,RuntimeException衍生出其它运行异常子类,22,class RuntimeException extends Exception,只有在执行时才能发现的异常,是Exception的直接子类。,class OutOfBoundsException extends RuntimeException,表示请求检索超越了数组等容器最大长度的异常。,class OverflowException extends RuntimeException,表示算法/缓存溢出异常,class RangeException extends RuntimeException,运行期间的范围异常,class UnderflowException extends RuntimeException,运行期间的算法/缓存的向下溢出异常。,class RuntimeException extends,23,在spl.php 中所有Exception子类的代码都仅仅是类的定义和简单的父类继承。,而方法内部没有任何扩展、重写。,如:LogicException的定义。,在spl.php 中所有Exception子类的代码都仅仅是,24,php教程_php面向对象(5)汇总ppt课件,25,又如:LengthException的定义部分,又如:LengthException的定义部分,26,PHP5,异常捕获,异常实例,可以通过实例化 Exception类或者它的子类来创建一个异常实例。,有了这个异常实例,就可以通过Exception中定义好的getter方法,获得相应的属性值。,PHP5异常捕获 异常实例,27,getCode()./;,echo getFile()= .$exception-getFile()./;,echo getLine()= .$exception-getLine()./;,echo getMessage()= .$exception-getMessage()./;,echo getTrace()= .$exception-getTrace()./;,echo getTraceAsString()= .$exception-getTraceAsString()./;,?,?,28,getCode()./;,echo getFile()= .$exception-getFile()./;,echo getLine()= .$exception-getLine()./;,echo getMessage()= .$exception-getMessage()./;,echo getTrace()= .$exception-getTrace()./;,echo getTraceAsString()= .$exception-getTraceAsString()./;,?,?,29,抛出异常,在PHP5中使用 throw 关键字,向外抛出一个异常实例。,如果这个异常如果未经处理,将会导致系统产生致命错误,而使代码终止。,抛出异常,30,根据需求,我们可以向系统抛出不同的异常。,在php中数组越界是不会产生知名错误的,而下面的代码抛出一个数组越界的异常,导致代码运行终止。, count($arr) ,$exception = new OutOfBoundsException(array $arr OutOfBounds Exception);,throw $exception;,?,根据需求,我们可以向系统抛出不同的异常。,31,在代码中捕获异常,可以通过PHP5支持的,try catch,语句捕获并处理异常。,语法如下:,try,/可能引发异常的语句,catch(异常类型 异常实例),/异常处理语句,在 try块中,放置可能产生异常的代码片段。在catch块中放置对这个异常处理的代码。 如:,try,throw new Exception(“new Exception”); / 引发抛出异常,catch(Exception $ex),echo $ex; /打印这个异常对象,在代码中捕获异常可以通过PHP5支持的try catch 语,32,如果try块未产生任何异常,try块将运行完毕,catch块内容不会被执行。,try块如果抛出了异常,会立刻在catch中寻找可以捕获改异常的catch块,并运行相应的catch块代码,然后跳出try catch块继续运行。 而try块中抛出异常后面的代码将被跳过。,如果try块中的异常不能被catch块捕获,将抛向系统引发系统致命错误,代码终止运行。,在catch中,异常类型后面跟的是一个变量,这个变量将指向内存中被捕获的异常实例。,如果try块未产生任何异常,try块将运行完毕,catch块,33,未使用异常处理时,我们从一个数组中取值,如果数组越界,PHP只会报出一个错误Notice,我们无法对这些错误做任何的处理。,在下面例子中,取值超过了数组边界,于是引发了自定义异常。在catch块做了处理。,未使用异常处理时,我们从一个数组中取值,如果数组越界,PHP,34, sizeof($arr) ,throw new OutOfBoundsException(数组 $arr 取值越界异常.);,$a = $arr$b; /如果没有异常就取出值,catch (OutOfBoundsException $ex),if($debug),echo 在第.$ex-getLine().行,产生异常,;,echo $ex-getMessage().;,echo 数组长度是 .sizeof($arr).不能取到位置$b. ;,$a = 0; /如果产生异常将0赋值给$a,echo $a = $a ;,?,?,35,大家注意到catch(Exception $ex) 中 Exception 这个类名,下面解释它的具体意义。,在catch块中能捕获在catch()块中声明的捕获的异常和其子类类型实例。,下面的例子,抛出一个OutOfBoundsException的异常,而catch语句捕获DomainException 异常。这个异常不会被catch语句捕获,而直接抛向了系统,引发了一个致命错误,程序被终止了。,大家注意到catch(Exception $ex) 中 Ex,36, sizeof($arr) ,throw new OutOfBoundsException(数组 $arr 取值越界异常.);,$a = $arr$b; /如果没有异常就取出值,catch (DomainException $ex),if($debug),echo 在第.$ex-getLine().行,产生异常,;,echo $ex-getMessage().;,echo 数组长度是 .sizeof($arr).不能取到位置$b. ;,$a = 0; /如果产生异常将0赋值给$a ,echo $a = $a ;,?,?,37,在catch块中能捕获catch()块里声明的异常的子类异常。,一个,catch,块处理多种异常, 在catch块中能捕获在catch()块中声明的捕获的异常和其子类类型实例。,在catch块中能捕获catch()块里声明的异常的子类异常,38, sizeof($arr) ,throw new OutOfBoundsException(数组 $arr 取值越界异常.);,$a = $arr$b; /如果没有异常就取出值,if(true),throw new RuntimeException(这里产生一个Runtime异常); /如果9行无异常,这里抛出异常.,catch (RuntimeException $ex),if($debug),echo 在第.$ex-getLine().行,产生异常,;,echo $ex-getMessage().;,$a = 0; /如果产生异常将0赋值给$a,echo $a = $a ;,?,?,39,多个,catch,块处理异常,一个try块可以跟随多个catch块,每个catch块捕获不同的异常。,下面例子的第7行,使用rand函数产生了一个0或1的随机数,反复运行这个代码会随机抛出逻辑异常或执行异常。,在try块后,有两个catch块,分别捕获并处理对应的异常,注意查看不同。,多个catch块处理异常,40,getLine().行,产生逻辑异常,;,echo $ex-getMessage().;,catch(RuntimeException $ex),if($debug),echo 在第.$ex-getLine().行,产生运行异常,;,echo $ex-getMessage().;,?,?,41,异常处理块嵌套,异常处理块只能处理自己catch块中的异常,已经处理过的异常将不会向外抛出。,异常处理块嵌套异常处理块只能处理自己catch块中的异常,已,42,异常向外抛出,异常向外抛出,代码中一旦throw一个异常实例,系统会寻找能够处理这个异常的try,catch块,如果当前方法不能够处理这个异常,就会向外抛出。抛向调用这个方法的代码,一直向外抛出,如果抛到最外层都无法处理这个异常,会引发致命错误,代码终止。,我们可以在方法引用的任何一个环节,根据业务需求决定捕获异常的位置。,异常向外抛出 异常向外抛出,43,php教程_php面向对象(5)汇总ppt课件,44,PHP5,自定义异常,PHP5自定义异常,45,异常处理实例,本例将写用户名和密码长度验证并对用户名和密码设定为只能是字符,配合正则表达式完成。,设定用户名和密码长度必须在3-8个之间,并且只能是字符与数字,异常处理实例 本例将写用户名和密码长度验证并对用户名和密码设,46,User.php 实现功能:, 定义User接口。, 实现存放用户信息的类。, 通过工厂模式返回用户类实例,定义一些参数的类,Properties.php,在这个类中集中定义了一些参数,方便进行后期一些与程序逻辑关系不大的维护。,自定义类, MyException.php,自定义了用户名和密码两个独立的异常类,以及其它子类。,User.php 实现功能:,47,验证用户名和密码长度合法性的类 Validate.php,在validateName方法和validatePassword两个方法中,分别对长度做了判断和验证。,并通过正则表达式,对用户输入的合法性做了验证。,虽然可以通过正则表达式一次验证用户字符合法性和长度, 本例没有这样写是为了向方法外抛出长度不同的异常,以及显示给用户的信息。,验证用户名和密码长度合法性的类 Validate.php,48,登录页面login.php。,登录会提交给 loginvalidate.php,这段代码相当于 MVC中的controller控制器。,登录成功页面,loginSuccess.php,显示用户登录信息,判断session。,登录页面login.php。,49,
展开阅读全文