很多时候程序会有异常,可以将异常封装成一个类,用于做统一异常管理,去处理controller中出现的错误
/**
-
统一处理异常,处理controller出现的异常,能够精确匹配异常
-
basePackages:处理那个controller下的异常
*/
//@Slf4j日志记录注解,将错误信息记录为日志
//@ResponseBody //以json的形式写出去
@Slf4j
//@ControllerAdvice(basePackages = “com.cc.mall.product.controller”)
@RestControllerAdvice(basePackages = “com.cc.mall.product.controller”) //@ResponseBody和@ControllerAdvice()的合体
public class MallExceptionControllerAdvice {
//数据校验的异常
//当controller出现异常的时候,就会来到这里就是MethodArgumentNotValidExceptione 这个是数据校验的时候的具体异常,根据终端打印的来相应修改
@ExceptionHandler(value = MethodArgumentNotValidException.class) //这个注解告诉springmvc这个异常处理类用于处理什么异常
public R handleVaildException(MethodArgumentNotValidException e){log.error("数据校验出现问题{},异常类型{}",e.getMessage(),e.getClass()); BindingResult bindingResult = e.getBindingResult(); Map<String,String> errorMap = new HashMap<>(); bindingResult.getFieldErrors().forEach((item)->{ //1.获取错误消息 String message = item.getDefaultMessage(); //2.获取错误的属性名 String field = item.getField(); errorMap.put(field,message); }); return R.error(BizCodeEnume.VAILD_EXCEPTION.getCode(),BizCodeEnume.VAILD_EXCEPTION.getMsg()).put("data",errorMap);
}
/**
-
对于无法精确匹配的异常进行处理
-
@return
*/
@ExceptionHandler(value = Throwable.class)
public R handleException(Throwable throwable){return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(),BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
-
}
2.同时可以编写个错误码和错误信息定义类
**1.错误码定义规则为5位数字
- 2.前两位表示业务场景,最后三位表示错误码。如100001 。10:通用,001:系统未知异常
- 3.维护错误码后需要维护错误描述,将他们定义为枚举形式
- 错误码列表
- 10:通用
- 001,参数格式校验
- 11:商品
- 12:订单
- 13:购物车
- 14:物流**
public enum BizCodeEnume {
//系统未知异常
UNKNOW_EXCEPTION(10000,"系统未知异常"),
//验证异常状态码
VAILD_EXCEPTION(10001,"参数格式校验失败");
//枚举就是个私有的构造器
private int code;
private String msg;
BizCodeEnume(int code,String msg){
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
}