zoukankan      html  css  js  c++  java
  • php异常处理

      php异常处理的一般格式:

    try
        if(false){
            //在预估会出错的地方设置并抛出异常
            throw new Exception("出错了");
        }
    }catch(Exception $e){
        $str = '捕获到错误:';
        $str .= $e->getMessage();
        $str .= ',在文件:';
        $str .= $e->getFile();
        $str .= '的第:' . $e->getLine() . '行';
        exit($str);
    }finally{
        //释放资源
    }

      文件读写与异常结合,主要看异常处理,请忽略文件操作:

    <?php
    header("Content-type:text/html;Charset=utf-8");
    
    $fileName = './testFile.txt';
    $somecontent = "<b style='color:blue'>ok</b>,这就是要写入的文字内容!<br>" . PHP_EOL;
    
    try{
        
        // 1.写文件
        //检查文件是否存在,没有文件时抛出异常
        if(!file_exists($fileName)){
            //没有文件时,以读打开创建文件
            $handle = fopen($fileName, 'w');
            if($handle)
                throw new Exception("没有此文件!");
        }else{
            //有文件时,以追加方式打开文件(文件指针指向文件末尾)
            $handle = fopen($fileName, 'a');
            //检查文件是否能写入,不能写入是因为文件权限没有打开(linux下是:chmod a+w ./testFile.txt)并抛出异常
            if(is_writable($fileName)){
                //不能写入时抛出异常,一般情况下资源没打开时才会出错,向上第二行 $handle 注释后会抛出异常
                if (@fwrite($handle, $somecontent) === FALSE) {  //写文件
                    throw new Exception("不能写入到文件{$fileName}!");
                }
            }else{
                throw new Exception("文件无权写入!");
            }
        }
        
        // 2.读文件
        if(file_exists($fileName)){
            $handle = fopen($fileName, 'r');
            if(filesize($fileName) > 0)
                $contents = fread($handle, filesize($fileName));  //读文件
            echo $contents;  //显示内容
        }else{
            throw new Exception('文件获取时发生错误!');
        }
        
    }catch(Exception $e){
        
        $show = '<span style="color:red">捕获到异常:</span><strong>';
        $show .= $e->getMessage();
        $show .= '</strong>,<span style="color:#789">在文件';
        $show .= $e->getFile();
        $show .= '第' . $e->getLine() . '行</span>';
        exit($show);
    
    // finally 在异常或正常情况下都被访问,一般用于关闭资源
    }finally{
        
        if(isset($handle))
            fclose($handle);
            
    }
    
    echo '<p style="color: #f4a">这是正常显示的内容!</p>';

      多异常情况下的案例:

    <?php
    
    /*自定义的一个异常处理类,但必须是扩展内置异常处理类的子类*/
    class myException extends Exception{
        //重定义构造器,使第一个参数 $message 为必须被指定的属性
        public function __construct($message, $code = 0){
            //可以在这里定义一些自已的代码
            //建议同时调用 parent::__construct() 来检查所有的变量是否已被赋值
            parent::__construct($essage, $code);
        }
        
        //重写父类中继承过来的方法,自定义字符串输出的样式
        public function  toString() {
            return __CLASS__ . ": [". $this->code . "]:" . $this->message . "<br>";
        }
        
        //为这个异常自定义一个处理方法
        public function customFunction() {
            echo"按自定义的方法处理出现的这个类型的异常";
        }
    }
    
    /*创建一个用 于测试自定义扩展的异常类TestException */
    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;     //为对象中的成员属性赋值
            }
        }
    }
    
    /*示例1:在没有异常时,程序正常执行,try中的代码全部执行,并不会执行任何catch区块*/
    try{
        $testObj = new TestException() ;        //使用默认参数创建异常的测试类对象
        echo "***********<br>";                         //没有抛出异常,这条语句就会正常执行
    }catch(MyException $e){                         //捕获用户自定义的异常区块
        echo "捕获自定义的异常: {$e}<br>";  //按自定义的方式输出异常消息
        $e->customFunction() ;                       //可以调用自定义的异常处理方法
    } catch(Exception $e) {                            //捕获PHP内置的异常处理类的对象
        echo "捕获默认的异常: ". $e->getMessage(). "<br>";  //输出异常消息
    }
    
    echo '<hr>';
    var_dump($testObj) ;  //判断对象是否创建成功,如果没有任何异常,则创建成功
    echo '<hr>';
    
    /*示例2:抛出自定义的异常,通过自定义的异常处理类捕获这个异常并处理*/
    try{
        $testobj1 = new TestException(1);  //传入1时,抛出自定义异常
        echo '************<br>';                     //这条语句不会被执行
    }catch(MyException $e){                      //这个catch区块中的代码将被执行
        echo "捕获自定义的异常:{$e}<br>";
        $e->customFunction();
    }catch(Exception $e){                          //这个catch区块不会被执行
        echo "捕获默认的异常:" . $e->getMessage() . "<br>";
    }
    
    echo '<hr>';
    var_dump ($testObj1);  //有异常产生,这个对象没有创建成功
    echo '<hr>';
    
    /*示例3: 抛出内置的异常,通过自定义的异常处理类捕获这个异常并处理*/
    try{
        $testObj2 = new TestException(2) ;  //传入2时,抛出内置异常
        echo  '*******++<br>';  //这条语句不会被执行
    }catch(MyException $e) {  //这个catch区块不会被执行
        echo "捕获自定义的异常:{$e}<br>";
        $e->customFunction();
    }catch(Exception $e){  //这个catch区块中的代码将被执行
        echo "捕获默认的异常: ", $e->getMessage() . "<br>";
    }
    
    echo '<hr>';
    var_dump($testObj2) ;  //有异常产生,这个对象没有创建成功
  • 相关阅读:
    JS中attribute和property的区别
    px(像素)、pt(点)、ppi、dpi、dp、sp之间的关系
    计算几何
    动态凸包
    斜率DP题目
    斜率DP个人理解
    后缀数组题目
    CF#190DIV.1
    MANACHER---求最长回文串
    扩展KMP题目
  • 原文地址:https://www.cnblogs.com/qingsong/p/13406844.html
Copyright © 2011-2022 走看看