第6章 AOP与全局异常处理

第6章 AOP与全局异常处理

6-1 正确理解异常处理流程 13:23

curl+alt+o 快速移除无用的use引入命名空间

静态调用model层处理业务流程,上面要引入命名空间,
model里文件名字和控制器的名字同名时,引入时上面要as一个别名



6-1-1 全局异常处理要做两件事情:

  1. 记录日志
  2. 做出统一的异常处理

6-2 固有的处理异常的思维模式与流程 14:23

6-2-1 思路:

控制器里调用model层验证异常,model层如果抛出异常,catch就会捕捉到并抛出异常

 model里抛出异常


运行结果

重要:
api处理的决对不能返回一个错误html的页面,要返回错的json信息


6-3 理清思路,总结异常的分类_ 06:33




6-4 实现自定义全局异常处理 上 17:04

调用model层

model里抛出异常

尝试所有的异常都抛出~~~~~~

ExceptionHandler.php里render()方法的$ex就会捕捉到并抛出异常

配置里设置为自定义异常处理方法

运行结果

<hr>


=====================================================================================

定义基础异常

定义BannerMissException异常,extends BaseException

error_code错误码

999  未知错误
1 开头为通用错误
2 商品类错误
3 主题类错误
4 Banner类错误
5 类目类错误
6 用户类错误
8 订单类错误

10000 通用参数错误
10001 资源未找到
10002 未授权(令牌不合法)
10003 尝试非法操作(自己的令牌操作其他人数据)
10004 授权失败(第三方应用账号登陆失败)
10005 授权失败(服务器缓存异常)


20000 请求商品不存在

30000 请求主题不存在

40000 Banner不存在

50000 类目不存在

60000 用户不存在
60001 用户地址不存在

80000 订单不存在
80001 订单中的商品不存在,可能已被删除
80002 订单还未支付,却尝试发货
80003 订单已支付过



6-5 实现自定义全局异常处理 下 16:04


6-5-1 测试思路:

6-5-1.1 调用model

v1/Banner.php里的getBanner里调用model层里的getBannerById(),
判断如果返回的为空,就抛出BannerMissException异常,抛出后,ExceptionHandler.php/render(Exception $e)就会接收到这个异常 (所以执出的异常,exceptionHandler都会捕捉到,由它判断异常的类型,而自定义异常都继承自BaseException异常,所以判断这个$e的异常属于是否BaseException自定义的异常,如果是就会出抛出自定义的异常处理.否则就抛出是服务器异常.
但要抛出这个自定义异常,首先BannerMissException要继承自Exception类,BaseException.php里继承自Exception类.BannerMissException又继承自BaseException.所以满足条件,没有问题

<?php
/**
 * Created by PhpStorm.
 * User: Haima
 * Date: 2018/7/8
 * Time: 15:58
 */

namespace app\api\controller\v1;
use app\api\model\Banner as BannerModel;
use app\api\validate\IDMustBePostiveInt;
use app\lib\exception\BannerMissException;

class Banner
{
    /**
     * 获取指定id的banner信息
     * @url /banner/:id
     * @http GET
     * @id banner的id号
     */
    public function getBanner($id)
    {

        (new IDMustBePostiveInt())->goCheck(); //验证$id是否为正整数
        $banner = BannerModel::getBannerById($id); //调用model
        if (!$banner){
           throw new BannerMissException(); //判断结果不存在,抛出异常
        }
//        return $banner;
    }
}

6-5-1.2 model层里验证数据返回null

return null;

<?php
/**
 * Created by PhpStorm.
 * User: Hiama
 * Date: 2018/7/12
 * Time: 1:16
 */

namespace app\api\model;
class Banner
{
    public static function getBannerById($id){
        return null;
    }
}

6-5-1.3 exceptionHandler.php判断异常类型,并抛出相应的异常

exceptionHandler.php里的render()方法判断Banner.php控制器抛出的是什么异常.
Banner.php控制器里抛出了BannerMissException异常,BannerMissException又继承自BaseException,
判断出$e最终属于BaseException异常,就会抛出自定义异常.
ExceptionHandler里获取BannerMissException里定义的code,msg和errorCode,
所以ExceptionHandler最终就会抛出BannerMissException里定义的code,msg和errorCode信息

<?php
/**
 * Created by PhpStorm.
 * User: Haima
 * Date: 2018/7/12
 * Time: 3:11
 */

namespace app\lib\exception;
use Exception;
use think\exception\Handle;
use think\Request;

class ExceptionHandler extends Handle
{
    private $code;
    private $msg;
    private $errorCode;

    public function render(Exception $e)
    {
        if($e instanceof BaseException){
            $this->code = $e->code;
            $this->msg = $e->msg;
            $this->errorCode = $e->errorCode;
        }
        else{
            $this->code = 500;
            $this->msg = '服务器错误,不想给你看';
            $this->errorCode = 999;
        }
        $request = Request::instance();
        $result = array(
            'msg'  => $this->msg,
            'error_code' => $this->errorCode,
            'request_url'  => $request->url()
        );
        return json($result,$this->code);
    }
}


<?php
/**
 * Created by Haima.
 * Author:Haima
 * QQ:228654416
 * Date: 2018/7/12
 * Time: 20:48
 */

namespace app\lib\exception;


class BannerMissException extends BaseException
{
    public $code =  404;

    public $msg = '请求的Banner不存在';

    public $errrCode = 40000;
}


<?php
/**
 * Created by Haima.
 * Author:Haima
 * QQ:228654416
 * Date: 2018/7/12
 * Time: 20:49
 */

namespace app\lib\exception;


use think\Exception;

class BaseException extends Exception
{
    //HTTP 状态码 404,200
    public $code = 400;

    //错误的具体信息
    public $msg = '参数错误';

    //自定义的错误码
    public $errorCode = 10000;
}

处理的结果:


6-6 ThinkPHP5中的日志系统 14:34


6-7 在全局异常处理中加入日志记录 09:13


6-8 全局异常处理的应用 上 25:23


6-9 全局异常处理的应用 中 12:04


6-10 全局异常处理的应用 下 04:16


6-11 本章小结与AOP思想 12:56




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值