面向对象之异常处理

面向过程和面向对象

面向过程的代码生成"错误(error)",而面向对象的代码产生"异常"(exception)

//面向过程
$link = mysql_connect('localhost', 'mysql_user', 'mysql_password');
if (!$link) {
    die('Could not connect: ' . mysql_error());
}
echo 'Connected successfully';
mysql_close($link);

异常处理比条件判断好的一点在于,它进一步地将程序的功能和逻辑与错误处理分离开来。进一步说,多重错误可以无须使用多层嵌套的条件语句就能得到处理。

//在该脚本中,try代码块中抛出的异常将会被catch代码块捕获并显示

function checkSoldier($age)
{
    if( $age < 18 || $age > 25 ){
        throw new Exception('你的年龄不达标',110);
    }
}

try{
    checkSoldier(-1);
}catch ( Exception $e){
    var_dump($a->getMessage());
}

使用try语句时,必须确保能够捕获所有的异常,以防止出现严重错误

基本语法

        try{
            //可能出现错误或异常的代码
            //catch 捕获  Exception是php已定义好的异常类
        } catch(Exception $e){
            //对异常处理,方法:
                //1、自己处理
                //2、不处理,将其再次抛出
        }

2、处理处理程序应当包括:

Try - 使用异常的函数应该位于 "try"  代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象 

扩展Exception类

PHP的Exception类十分简单,这样的设计目的,就是方便用户扩展它,根据需要来添加、修改功能 注意:Exception类中只有构造函数和__toSting()方法是可以覆盖的,因为其他方法都被定义final类型

补充

class MyException extends Exception
{
    public function log()
    {
        $log = date('Y-m-d').$this->getFile().'第'.$this->getLine().'行,出现异常,异常编码为:';
        $log .= $this->getCode().'异常信息为:'.$this->getMessage();
        $log .= PHP_EOL;
        file_put_contents('run.log',$log,FILE_APPEND);
    }
}

try{
    $link = @mysqli_connect('localhost','root','root','demo2');
    if( !$link ){
        throw new MyException('数据库连接失败');
    }
}catch (MyException $a){
    var_dump($a->getMessage());
}catch (Exception $e){
    echo $e->getMessage();
}
//继续抛异常
try{
    try{
        if(1){
            throw new MyException('xx',110);
        }
    }catch (MyException $q){
        if($q->getCode() == 110){
            throw $q;
        }
    }
}catch (Exception $e){
    var_dump($e->getMessage());
}

自定义异常处理类

//PHP中对于异常的机制使用,一般用于业务逻辑判断上面,当业务逻辑不正常时,进行特殊处理

/**
1.Exception::__construct — 异常构造函数
2.Exception::getMessage — 获取异常消息内容
3.Exception::getPrevious — 返回异常链中的前一个异常
4.Exception::getCode — 获取异常代码
5.Exception::getFile — 获取发生异常的程序文件名称
6.Exception::getLine — 获取发生异常的代码在文件中的行号
7.Exception::getTrace — 获取异常追踪信息
8.Exception::getTraceAsString — 获取字符串类型的异常追踪信息
9.Exception::__toString — 将异常对象转换为字符串
10.Exception::__clone — 异常克隆

*/

class JackException extends Exception
{
    public function errorMessage()
    {
        $errorMsg = '错误在第 '.$this->getLine().' 行 '.$this->getFile()
        .': <b>'.$this->getMessage().'</b> --- 证明你在撒谎';
        return $errorMsg;
    }
}

$a = 0;

try{
    if( !$a ){
        throw new JackException('a可是不能为零啊');
    }
    $v = 4/$a;
}catch(JackException $e){
    echo $e->errorMessage();