课程名称:微信小程序电商实战
课程章节:AOP 与全局异常处理
课程讲师:7 七月
课程内容:
- 全局异常处理
- 记录日志
- 统一返回错误信息格式
- 什么时候使用异常
- 用户行为异常(没有通过验证器,没有查询到结果):不记录日志、向用户返回具体信息
- 服务器自身异常(代码错,调用外部接口错误):记录日志,不向客户端返回具体信息
- 在 application 目录下创建文件夹 lib/exception(异常处理层-类库)
Exception 基类
class BaseException
{
// HTTP 状态码
public $code = 400;
// 错误具体信息
public $msg = 'invalid parameters';
// 自定义错误码
public $errorCode = 999;
public $shouldToClient = true;
/**
* 构造函数,接收一个关联数组
* @param array $params 关联数组只应包含code、msg和errorCode,且不应该是空值
*/
public function __construct($params=[])
{
if(!is_array($params)){
return;
}
if(array_key_exists('code',$params)){
$this->code = $params['code'];
}
if(array_key_exists('msg',$params)){
$this->msg = $params['msg'];
}
if(array_key_exists('errorCode',$params)){
$this->errorCode = $params['errorCode'];
}
}
}
Exception 子类
class BannerMissException extends BaseException
{
public $code = 404;
public $msg = '参数错误';
public $errorCode = 40000;
}
Handle 异常处理类
class ExceptionHandler extends Handle
{
private $code;
private $msg;
private $errorCode;
public function render(Exception $ex)
{
if($e instanceof BaseException) {
//如果是自定义异常,则控制http状态码,不需要记录日志
//因为这些通常是因为客户端传递参数错误或者是用户请求造成的异常
//不应当记录日志
$this->code = $e->code;
$this->msg = $e->msg;
$this->errorCode = $e->errorCode;
} else {
// 如果是服务器未处理的异常,将http状态码设置为500,并记录日志
if(config('app_debug')){
// 调试状态下需要显示TP默认的异常页面,因为TP的默认页面
// 很容易看出问题
return parent::render($e);
}
$this->code = 500;
$this->msg = 'sorry, we make a mistake. (^o^)Y';
$this->errorCode = 999;
$this->recordErrorLog($e);
}
$request = Request::instance();
$result = [
'msg' => $this->msg,
'error_code' => $this->errorCode,
'request_url' => $request = $request->url()
];
return json($result, $this->code);
}
}
config.php 配置
exception_handle => 'app\lib\exception\ExceptionHandler'
ParameterException 通用参数类异常错误
class ParameterException extends BaseException
{
public $code = 400;
public $errorCode = 10000;
public $msg = "invalid parameters";
}
课程收获:
- 开发 api 和开发网页是截然不同的,特别是错误返回的处理
- 了解 render 机制
- 预习:调用异常类抛出信息,TP5 日志处理