@RestControllerAdvice(annotations = RestController.class)
这个注解百度很多,这里就不重复诉说了。主要是被捕获的异常以何种形式进行返回,我这里分成自定义异常与非自定义异常,其中自定义异常的errCode统一为0
代码中首先日志收集具体报错服务及信息,然后再根据当前的运行环境(pro)区别的返回报错信息,正常业务异常统一用自定义异常,使用的R.fail的方法,其返给前端的code是201,反之全部用常规异常的处理方式,返给前端的code就是202了。如果按照这个规范编写统一异常,即区分了运行环境,又区分异常场景。
public R sendErrMsg(String msg, String allMsg, int errCode) {
Tool.log.error("服务名称:{},端口:{},编码:{},消息:{}", name, port, errCode, allMsg);
if (profiles.equals("pro")) {
if (errCode == 0) {
//正常业务提示异常
return R.fail(msg, errCode);
} else {
//非正常参数,代码异常
return R.error("请求错误,请联系管理员处理或者稍后重试!", errCode);
}
} else {
if (errCode == 0) {
return R.fail(msg, errCode);
} else {
return R.error(msg, errCode);
}
}
}
//自定义异常
@ResponseBody
@ExceptionHandler(value = Rexception.class)
R MyException(Rexception e, Object body) {
return sendErrMsg(e.getMessage(), e.getMessage(), 0);
}
//参数校验错误
@ResponseBody
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(value = MethodArgumentNotValidException.class)
R MethodArgumentNotValidException(MethodArgumentNotValidException e) {
String message = StringUtils.collectionToCommaDelimitedString(
e.getBindingResult().getAllErrors()
.stream()
.map(DefaultMessageSourceResolvable::getDefaultMessage)
.collect(Collectors.toList())
);
return sendErrMsg(message, ExceptionUtil.stacktraceToString(e), 1);
}