在上篇文章的基础上继续完善自定义的全局异常处理层。
根据异常的不同,有不同的处理方式:如果是用户输入导致的异常需要向客户端返回异常信息,不需要记录日志;如果是服务器代码自身导致的异常则需要记录日志,不需要向客户端返回异常信息(因为即使你返回异常信息,针对这种异常用户也无能为力)。
在写代码过程中,如何区分这两种异常就成为问题的重中之重,常用的思路是建立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路径。
网友评论