统一的异常处理
* @ControllerAdvice
* 1)创建common的枚举类封装错误码和错误信息。
* 2)编写异常处理类,使用@ControllerAdvice。
* 3)使用@exceptionHandler标注方法可以处理的异常。
1.在子服务中,我们新建一个exception目录用于存放处理异常的类:
2.在公共服务中,新建异常的枚举类BizCodeEnume,用于封装所有的错误状态码和错误信息:
编写枚举类:
/**
* 封装错误状态码和信息
*/
public enum BizCodeEnume {
UNKNOW_EXCEPTION(10000,"系统未知异常"),
VALID_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;
}
}
3.在原来子服务exception包下新建ExceptionControllerAdvice类,用于处理抛出的异常:
/**
* 集中处理所有异常
*/
@Slf4j
/**
* 集中处理这个包下的异常
*/
@RestControllerAdvice(basePackages = "com.product.controller")
public class ExceptionControllerAdvice {
//处理表单校验类的异常信息
@ExceptionHandler(value = MethodArgumentNotValidException.class)
public R handValidException(MethodArgumentNotValidException e){
log.error("数据校验出现问题{},异常类型:{}",e.getMessage(),e.getClass());
//获取异常信息
BindingResult bindingResult = e.getBindingResult();
//创建空的HashMap
Map<String,String> errorMap = new HashMap<>();
//遍历所有错误属性和信息
bindingResult.getFieldErrors().forEach((fieldError)->{
//将错误属性和信息对应放入map中
errorMap.put(fieldError.getField(),fieldError.getDefaultMessage());
});
//return R.error(400, "数据格式错误").put("data", errorMap);
//返回异常消息
return R.error(BizCodeEnume.VALID_EXCEPTION.getCode(), BizCodeEnume.VALID_EXCEPTION.getMsg()).put("data",errorMap);
}
/**
* 捕获所有类型抛出的异常
*/
@ExceptionHandler(value = Throwable.class)
public R handException(Throwable throwable){
return R.error(BizCodeEnume.UNKNOW_EXCEPTION.getCode(), BizCodeEnume.UNKNOW_EXCEPTION.getMsg());
}
}
其中调用之前所写的公共服务中的枚举类BizCodeEnume获取错误状态码和错误信息。
4.发请求测试(请求参数格式自拟):
5.测试成功,完成统一异常处理。