回顾:上篇博客中,通过config.php中指定异常处理类为自定义的ExceptionHandel.php类,通过在自定义的ExceptionHandel.php类中重写render方法可以在程序出现错误时抛出自己定义的错误信息。
1、BaseException类
class BaseException extends Exception
{
public $code = 400;//http status code
public $msg = '参数错误';
public $errorCode = 10000;
}
2、没有找到banner的异常类BannerMissException继承覆盖父类BaseException中的成员属性;
此时BannerMissException instanceof BaseException为 true
class BannerMissException extends BaseException
{
public $code = 404;//http status code
public $msg = '请求的Banner不存在';
public $errorCode = 40000;
}
3、ExceptionHandel.php类中
namespace app\lib\exception;
use think\Exception;
use think\exception\Handle;
use think\Request;
class ExceptionHandler extends Handle
{
private $code;
private $msg;
private $errorCode;
//判断传入的异常类是否属于BaseException基类
//如果属于基类,即说明是自定义的错物,此时返回自定义$e(BannerMissException)的信息code msg 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;
}
//获取请求的url
$request = Request::instance();
$result = [
'msg' => $this->msg,
'error_code' => $this->errorCode,
'request_url' => $request->url()
];
return json($result,$this->code);
}
}
5、控制器中
//如果返回值为null则说明未找到banner,此时扔出BannerException类
//让自定义的ExceptionHandle处理BannerMissException类
$banner = BannerModel::getBannerById($id);
if ($banner==null){
throw new BannerMissException();
}
5、控制器中,如果返回值为null则说明未找到banner,此时扔出BannerException类,而我们前面已经定义处理异常错误类为自定义的ExceptionHandle类。因此步骤如下
(1)未找到banner信息
|
(2)抛出BannerMissException类
|
(3)自定义的ExceptionHandle处理BannerMissException类
|
(4)判断BannerMissException是否属于基类BaseException
(即判断BannerMissException是否继承了BaseException)
| |
(5)属于, (5)不属于,
则错误码信息为 则错误码信息为
$e(BannerMissException)定义的错误码信息 500服务器内部未知错误
注意:
上文设置会导致httpException,因此需要完善
httpException和think\Exception不是继承关系
但是两者都继承 \Exception 因此在render方法中修改 think\Exception 为 \Exception
public function render(\Exception $e)
{
//自定义的异常
if ($e instanceof BaseException){
//自定义的异常
}else{
//未知异常,记录日志,方便开发人员找到错误原因
}
return json($result,$this->code);
}