php中的异常

扩展PHP内置的异常处理类;可以通过实例化Exception类或者它的子类来创建一个异常实例。

Exception::__construct — 异常构造函数
Exception::getMessage — 获取异常消息内容
Exception::getPrevious — 返回异常链中的前一个异常
Exception::getCode — 获取异常代码
Exception::getFile — 创建异常时的程序文件名称
Exception::getLine — 获取创建的异常所在文件中的行号
Exception::getTrace — 获取异常追踪信息
Exception::getTraceAsString — 获取字符串类型的异常追踪信息
Exception::__toString — 将异常对象转换为字符串
Exception::__clone — 异常克隆

内置异常子类

Exception是所有异常类的基类、下面两个直属子类LogicException 逻辑处理异常类,和RuntimeException 运行时异常类。

php中异常处理

异常处理功能提供了处理程序运行时出现的错误或异常情况的方法。

PHP5提供了一种新的面向对象的错误处理方法。使用检测(try)抛出(throw)捕获(catch)异常

try 使用异常的函数应该位于”try”代码块内。如果没有出发异常,则代码将照常继续执行。如果异常被出发,会抛出一个异常。

throw 这里规定如何出发异常,每一个“throw”,必须对应至少一个”catch”.

catch “catch”代码块会捕获异常,并创建一个包含异常信息的对象。

一个 try 至少要有一个与之对应catch。定义个多个catch可以捕获不同的对象.php会按这些catch被定义的顺序执行,知道完成最后一个为止。

php异常处理语句

$e = new Exception('我是错误',2);
echo "错误信息:",$e->getMessage(),"<br/>";
echo "错误行号:",$e->getLine();
throw $e; //如果抛出异常不捕获  将会报错Fatal error: Uncaught Exceptio
<?php      //正确语法
class A{
   public function __construct(){
       throw new Exception('错误信息');
   }
}

try{
    $a=new A();
    echo "没有异常、我会执行";
}catch(Exception $e){
 echo '在文件',$e->getFile(),'中的第',$e->getLine(),'行,中产生异常信息:',$e->getMessage();
}

多个catch捕获不同的异常

<?php
class A{
    public function __construct(){
        $i=mt_rand(0,5);
        if($i>2){
            throw new OutOfBoundsException('这是一个异常错误',2);
        }else{
            throw new OutOfBoundsException('这是数组越界异常',3);
        }
    }
}
try{
    $a=new A();
    echo "没有异常、我会执行";
}catch(OutOfBoundsException $e){
    echo '在文件',$e->getFile(),'中的第',$e->getLine(),'行,产生异常信息:',$e->getMessage();
}catch(Exception $e){
    echo "这是普通异常:",$e->getMessage();
}

嵌套try{}catch(){}异常

<?php
class A{
    public function __construct(){
        $i=mt_rand(0,10);
        if($i>2 && $i<5){
            throw new OutOfBoundsException('这是一个异常错误',2);
        }elseif($i<2){
            throw new OutOfBoundsException('这是数组越界异常',3);
        }
    }
}
try{
    $a=new A();
    echo "没有异常、我会执行<br/>";
    try{
       throw new RangeException('这是新的异常',5);
    }catch (Exception $ee){
        echo $ee->getMessage();
    }
}catch(OutOfBoundsException $e){
    echo '在文件',$e->getFile(),'中的第',$e->getLine(),'行,产生异常信息:',$e->getMessage();
}catch(Exception $e){
    echo "这是普通异常:",$e->getMessage();
}

自定义异常注意事项

自定义异常必须继承自Exception 类或者它的子类。

自定义的异常需要重新定义构造函数的话,建议同时掉用parnet::__construct()来检查所有的变量是否已被赋值。

当对象要输出字符串的时候,可以重载__toString()并自定义输出的样式。

<?php
class MyException extends Exception {
    public function __construct($msg,$code){
        //如果重写异常类方法、构造函数  需要传递变量、不然调用方法没有参数
        parent::__construct($msg,$code);
    }
    public function __toString()
    {
        return "这是自定义异常类:".__CLASS__."<br/>";
    }
}
try{
    throw  new MyException("这是我自定义的异常",2);
    echo "没有异常、我会执行<br/>";
}catch(MyException $e){
    echo '在文件',$e->getFile(),'中的第',$e->getLine(),'行,产生异常信息:',$e->getMessage();
    echo "<br/>",$e;
}

设置顶层异常处理器

set_exception_handler()函数可以设置处理所有为捕获异常的用户定义函数。

<?php
class MyException extends Exception {
}
//设置顶层处理异常函数
function my_exception_handler(Exception $e){
    echo $e->getMessage(),"<br/>";
}
set_exception_handler('my_exception_handler');
class Test{
    function __construct()
    {
        throw new MyException('我是异常在TEST里面',3);
    }
}
$t= new Test();
Last modification:January 7, 2020
如果觉得我的文章对你有用,请随意赞赏