0
点赞
收藏
分享

微信扫一扫

REST API开发技巧集锦(4):使用全局异常处理返回信息

回顾:上篇博客中,通过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);
}

 

举报

相关推荐

0 条评论