12. php的错误和异常处理(二)
2016-05-23 18:20
387 查看
1. 异常处理实现
通过以下语句实现:<?php try{ //所有需要进行异常处理的代码都必须放入这个代码块内 ... ... //这里可以使用throw语句跑出一个异常对象 }catch(ex1){ //使用该代码块捕获一个异常,并处理 ... ... //处理发生的异常,也可再次抛出异常 }
在PHP代码中所产生的异常可以被throw语句抛出并被catch语句捕获。需要进行异常处理的代码都必须放入try代码内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch,也不可能出现单独的catch。例如:
<?php try{ $error = 'Always throw this error'; throw new Exception($error); //创建一个异常对象,通过throw语句抛出 echo '不执行'; //从这里开始,try代码内的代码将不会再被执行 } catch(Exception $e){ echo ' 错误信息:',$e->getMessage(),"</br>";//输出捕获的异常消息 } echo "Hello World"; //程序没有崩溃继续向下执行
在PHP中,异常必须手动抛出。throw关键字将触发异常处理机制,它是一个语言结构,而不是一个函数,但必须给它传递一个对象作为值。如果在try语句中有一场对象被抛出,该代码块不会再继续向下执行,而直接跳转到catch中执行。在catch代码块中可以简单地输出一些异常的原因。在异常处理之后,程序不会崩溃会继续执行。
2. 扩展PHP内置的异常处理类
异常处理类Exception的结构,它并不是一段有实际意义的可用代码。<?php class Exception { protected $message = 'Unknown exception'; //异常消息 protected $code = 0; //用户自定义异常代码 protected $file; //发生异常的文件名 protected $line; //发生异常的代码行号 function __construct($message = null, $code = 0){} //构造方法 final function getMessage(){}//返回异常信息 final function getCode(){} //返回异常代码 final function getFile(){} //返回发生异常的文件名 final function getLine(){} //返回发生异常的代码行号 final function getTrace(){} //backtrace()数组 final function getTraceAsString(){} //已格式化成字符串的getTrace()信息 /** * 重载方法 * @return {[type]} [description] */ function __toString(){} //可输出的字符串 }
如果使用自定义的类作为异常处理类,则必须是扩展内置异常处理类Exception的子类,非Exception类的子类是不能作为异常处理使用的。注意使用parent::construct()来检查所有的变量是否已经被赋值
例如:custom_error.php
<?php /** * Description: 自定义的一个异常处理类,但必须是扩展内异常处理的子类 * Version: 1.1 * Author: Chang * Date: 2016/05/23 * Time: 17:39 */ class MyException extends Exception{ /** * 重定义构造方法使用第一个参数message变为必须指定的属性 * @param [type] $message [description] * @param integer $code [description] */ public function __construct($message, $code = 0){ //可以在这里定义自己的代码 //建议同时调用parent::construct()来检查所有的变量是否已经被赋值 parent::__construct($message, $code); } /** * 重写父方法,自定义字符串输出的样式 * @return string [description] */ public function __toString(){ return __CLASS__.":[".$this->code."]".$this->message."<br/>"; } /** * 为这个异常自定义一个处理方法 * @return [type] [description] */ public function customFunction(){ echo "按自定义的方法处理出现的这个类型的异常</br>"; } } try{//使用自定义的异常类捕获一个异常,并处理异常 $error = '允许抛出这个错误'; throw new MyException($error); //创建一个自定义的异常类对象,通过throw语句抛出 echo "不会被执行"; }catch(MyException $e){ echo '捕获异常:'.$e; //输出捕获的异常消息 $e->customFunction(); //通过自定义的异常对象中的方法处理异常 } echo '你好啊';
3. 捕获多个异常
在try代码块之后,必须至少给出一个catch代码块,也可以将多个catch代码块与一个try代码块进行关联。如果有多个catch代码块,传递给每一个catch代码块的对象必须具有不同的类型。PHP可以自动找到对应类型的catch块。如果都没有匹配到,则跳转到最有一个catch的后面继续执行。例如:<?php /** * Description: 捕获多个异常 * Version: 1.1 * Author: Chang * Date: 2016/05/23 * Time: 17:58 */ include './custom_error.php'; class TestException{ public $var; //用来判断对象是否创建成功的成员属性 function __construct($value = 0){ //通过构造方法的传值决定抛出的异常 switch($value){ //对传入的值进行选择性的判断 case 1: //传入参数为1,则抛出自定义的异常对象 throw new MyException("传入的值'1'是一个无效参数", 5); break; case 2: //传入参数为2,则抛出PHP内置的异常对象 throw new Exception("传入的值'2'不允许作为一个参数", 6); break; default: //传入参数合法,则不抛出异常 $this->var = $value; //为对象成员属性赋值 break; } } } try{ $testObj = new TestException(); //使用默认的参数创建异常的测试类对象 echo "*****<br>"; //没有异常,正常执行 }catch(MyException $e){ echo "捕获自定义的异常:$e <br/>"; $e->customFunction(); }catch(Exception $e){ echo "默认捕获的异常:".$e->getMessage()."<br/>"; } var_dump($testObj); //判断对象是否创建成功,如果没有任何异常,则创建成功 try{ $testObj1 = new TestException(1); //传入1时,抛出自定义异常 echo "*****<br>"; //不被执行 }catch(MyException $e){ echo "捕获自定义的异常:$e <br/>"; $e->customFunction(); }catch(Exception $e){ //这个catch区块不被执行 echo "默认捕获的异常:".$e->getMessage()."<br/>"; } var_dump($testObj1); //有异常产生,这个对象没有创建成功 try{ $testObj2 = new TestException(2); //传入2时,抛出内置异常 echo "*****<br>"; //不被执行 }catch(MyException $e){ //这个catch区块不被执行 echo "捕获自定义的异常:$e <br/>"; $e->customFunction(); }catch(Exception $e){ echo "默认捕获的异常:".$e->getMessage()."<br/>"; } var_dump($testObj2); //有异常产生,这个对象没有创建成功
相关文章推荐
- 一个关于if else容易迷惑的问题
- Python动态类型的学习---引用的理解
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- rem : web app适配的秘密武器
- 如何优雅地处理前端异常?
- php7 读取php.ini[4]
- 土人系列AS入门教程 -- 对象篇
- Ruby中的异常处理代码编写示例
- C#托管堆对象实例包含内容分析
- C#实现获取不同对象中名称相同属性的方法
- PHP+Apache在Windows 9x下的安装和配置
- IIS 6 的 PHP 最佳配置方法
- 安装Apache和PHP的一些补充