微信小程序开发微信小程序开发者

小程序全栈学习-自定义全局异常处理(下)

2019-02-25  本文已影响8人  Answer_ccbb

在上篇文章的基础上继续完善自定义的全局异常处理层。  

根据异常的不同,有不同的处理方式:如果是用户输入导致的异常需要向客户端返回异常信息,不需要记录日志;如果是服务器代码自身导致的异常则需要记录日志,不需要向客户端返回异常信息(因为即使你返回异常信息,针对这种异常用户也无能为力)。

在写代码过程中,如何区分这两种异常就成为问题的重中之重,常用的思路是建立BaseException,然后类各种由于用户输入导致的异常都要继承BaseException类,如果返回的异常是继承BaseException的类那么它就是第一种异常(用户输入导致的异常),反之则是第二种异常。

这里采用接口中采用id来查询对应的Banner信息为例详细说明异常处理流程。

1、在接口控制器中

$banner = BannerModel::getBannerByID($id);   通过id参数来查找Banner信息,并赋值给变量banner

    if(!$banner){       //如果banner为空

        throw new BannerMissException();   //如果变量banner为空,抛出BannerMissException,而BannerMissException 是继承BaseException的类

    }

return $banner;  //Banner不为空,返回Banner信息

2、BannerMissException 继承BaseException:

class BannerMissException extends BaseException

3、判断结果:第一种异常

if($e instanceof BaseException){ //如果是自定义的异常

    $this->code = $e->code;

    $this->msg = $e->msg;

    $this->errorCode = $e->errorCode;

}

$results = [

        'msg' => $this->msg,

        'error_code'=>$this->errorCode,

        'request_url'=>$request->url()

    ];

    return json($results,$this->code);

}

这里有几点需要注意:

rest要求返回的错误信息有:错误码,错误信息、发生错误的URL,其中前两项比较容易理解,如何得到发生错误的当前的URL?

$request = Request::instance();//先实例化request对象;

'request_url'=>$request->url();//request对象中的url()方法可以直接得到当前的URL路径。

上一篇下一篇

猜你喜欢

热点阅读