• 微信号
目录

php基础

您当前的位置:首页 > 我的笔记 > php基础>php异常处理

php异常处理

异常处理概述

php中加入了异常处理机制,它与错误的区别在于:异常定义了程序中遇到的非致命的错误,如,程序运行磁盘不足,网络连接中断、被操作的文件不存在等。

在处理这些异常错误前,需要获取异常错误信息,才能推断程序中错误所在。在php中内置了一个异常类Exception来描述异常信息

class Exception{
    protected $message='Unknown exceptiong'; //异常信息
    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()信息
    // 可重载的方法
    function __toString(); //可输出字符串
}

从Exception类定义可以看出,Exception类中成员属性和方法是用来描述和获取程序中异常信息,通过异常对象可以获取当前程序中的错误信息,从而方便程序对错误进行处理。

异常的处理

当异常发生时,需要对异常进行捕获并进行处理,在php中可以通过throw关键字抛出一个异常,如果要捕获和处理异常需要try…catch代码块来完成。

案例

<?php
    //创建可抛出一个异常的函数
    function checkNum($number){
        if($number>1){
            //抛出异常
            throw new Exception("value must be 1 or below");
        }
        return true;
    }
    //可能触发异常的代码
    try{
        checkNum(2);
    }
    //捕获异常
    catch(Exception $e){
        echo 'Message:' . $e->getMessage();
    }
?>

运行结果

陵小宇博客php异常处理

使用throw关键字抛出一个异常,在try块中调用了引发异常的checkNum()函数。如果没有出发异常,则代码继续执行。如果异常被出发,则会抛出一个异常。使用catch块捕获异常,并创建一个包含异常信息的对象,异常被捕获后,执行catch块中处理的代码

自定义异常

虽然php提供了异常处理Exception具备常用的一些功能,但有时候我们希望使用不同的异常类,针对特定类型的异常进行处理,此时需要创建一个自定义异常类

自定义异常类,只需要继承自Exception类,并添加自定义的成员属性和方法即可

案例

<?php
    //创建一个自定义异常类CustomException,继承自Exception
    class CustomException extends Exception{
        //定义错误方法 errorMessage
        public function errorMessage(){
            //定义错误信息显示格式
            $errorMsg= 'error on line'.$this->getLine().'in'.$this->getFile().':<b>'.$this->getMessage().'</b> is not a valid E-Mail address';
            return $errorMsg;
        }
    }
    $email="admin@qq....com";
    try{
        //检查邮箱地址是否合法
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){
            //如果邮箱地址不合法,则抛出异常
            throw new CustomException($email);

        }
    }
    catch (CustomException $e){
        //输出格式错误
        echo $e->errorMessage();
    }
?>

运行结果

陵小宇博客php异常处理

代码定义了一个自定义异常类CustomException,继承自Exception类,并添加了成员发发errorMessage(),try代码用于检查邮箱是否合法,若邮箱非法,则抛出自定义异常CustomException。catch代码块用于处理捕获的异常

多个catch块

一段脚本可以使用多个异常,来检测多种情况,也就是说一个try语句对应多个catch语句。在脚本中可以使用多个if……else代码块,或一个switch代码块,或者嵌套多个异常。这些异常能够使用不同的异常类,并返回不同的错误信息。

案例

<?php
    //创建一个自定义异常类CustomException,继承自Exception
    class CustomException extends Exception{
        //定义错误方法 errorMessage
        public function errorMessage(){
            //定义错误信息显示格式
            $errorMsg= 'error on line'.$this->getLine().'in'.$this->getFile().':<b>'.$this->getMessage().'</b> is not a valid E-Mail address';
            return $errorMsg;
        }
    }
    $email="user@admin.com";
    try{
        //检查邮箱地址是否合法
        if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE){
            //如果邮箱地址不合法,则抛出异常
            throw new CustomException($email);

        }
        //检查邮箱地址是否存在字符串admin
        if(strpos($email,"admin") !== FALSE){
            //如果存在则抛出异常
            throw new Exception("$email is an example e-mail");
        }
    }
    catch (CustomException $e){
        //捕获我们自定义错误类CustomException中抛出的邮件是否合法的异常信息
        echo $e->errorMessage();
    }
    catch(Exception $e){
        //捕获默认错误类Exception抛出永祥地址中是否有字符串“admin”的异常信息
        echo $e->getMessage();
    }
?>

运行结果

陵小宇博客php异常处理

定义一个自定义异常类CustExceptiom,在try代码更具用户输入地址不同,会引发不同的异常,会引发不同的异常,在两个catch代码块中分别捕获CustExceptiom和Exception异常并处理

重新抛出异常

在实际开发中,但异常信息抛出需要以不同的方式对它进行处理,此时,可以在一个catch快代码中再次抛出异常,脚本应该对用户掩藏系统错误,对编程人员来说,系统错误也许很重要,但是用户对他们并不感兴趣,为了让用户更容易使用,可以再次抛出比较友好的消息异常

案例

<?php
    //创建一个自定义异常类CustomException,继承自Exception
    class CustomException extends Exception{
        //定义错误方法 errorMessage
        public function errorMessage(){
            //定义错误信息显示格式
            $errorMsg= 'error on line'.$this->getLine().'in'.$this->getFile().':<b>'.$this->getMessage().'</b> is not a valid E-Mail address';
            return $errorMsg;
        }
    }
    $email="user@admin.com";
    try{
        try{
            //检查邮箱地址是否存在字符串admin
            if(strpos($email,"admin") !== FALSE){
                //如果存在则抛出异常
                throw new Exception($email);
            }
        }
        catch(Exception $e){
            //再次抛出异常
            throw new CustomException($email);
        }
    }
    catch (CustomException $e){
        //捕获异常信息
        echo $e->errorMessage();
    }
   
?>

运行结果

陵小宇博客php异常处理

设置顶层异常处理器

在实际开发中,为了保证程序正常运行,需要在所有可能出现的异常的地方进行异常监视,但是程序出现异常的地方是无法预料的,为了保证程序正常运行,php提供了set_exception_handler()函数用于对这些没有进行异常监视的异常进行处理,改函数也称为顶层异常处理器

顶层异常处理器用于没有用try/catch块来捕获的异常,改函数声明如下

callable set_exception_handler(callable $exception_handler)

该函数只有个参数$excerption_handler()表示异常处理函数,该异常处理函数需要在调用前定义

案例

<?php
    function ExceptionHandle($exception){
        echo "<b>异常信息:</b>" .$exception->getMessage();
    }
    set_exception_handler("ExceptionHandle");
    throw new Exception("你没有捕获的异常信息");
?>

运行结果

陵小宇博客php异常处理

set_exception_handler()函数接受了ExceptionHandle()函数作为参数,通过throw抛出一个异常,但没有与之对应的try和catch代码块,所以触发了set_exception_handler()函数,通过执行ExceptionHandle()函数实现了异常的处理