12. php的错误和异常处理(二)

来源:互联网 发布:伊登软件股份有限公司 编辑:程序博客网 时间:2024/06/03 18:51

1. 异常处理实现

通过以下语句实现:

<?phptry{    //所有需要进行异常处理的代码都必须放入这个代码块内    ... ... //这里可以使用throw语句跑出一个异常对象}catch(ex1){    //使用该代码块捕获一个异常,并处理    ... ...     //处理发生的异常,也可再次抛出异常}

在PHP代码中所产生的异常可以被throw语句抛出并被catch语句捕获。需要进行异常处理的代码都必须放入try代码内,以便捕获可能存在的异常。每一个try至少要有一个与之对应的catch,也不可能出现单独的catch。例如:

<?phptry{    $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的结构,它并不是一段有实际意义的可用代码。

<?phpclass 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); //有异常产生,这个对象没有创建成功
0 0
原创粉丝点击