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) ;  //有异常产生,这个对象没有创建成功
原文地址:https://www.cnblogs.com/qingsong/p/13406844.html