往往为了程序的健壮性,有时候不得不时刻提防异常的发生,一般做法就是能try的地方尽量try住。但是太过繁琐,对业务开发非常不友好。如何才可以不关心这类异常呢?全部往外抛呢。
如何优雅地处理?
声明一个全局异常捕获的切
/**
* 统一异常处理:针对没有显式捕获异常的controller
*/
@ControllerAdvice
@Slf4j
public class ExceptionHandlerAdvice {
@ExceptionHandler({Exception.class})
@ResponseBody
public BaseJsonResponse handleException(Exception e) {
log.error("sys error", e);
//参数验证失败,例如非空验证,日期格式验证等
if (e instanceof MethodArgumentNotValidException) {
MethodArgumentNotValidException methodArgumentNotValidException = (MethodArgumentNotValidException) e;
FieldError fieldError = methodArgumentNotValidException.getBindingResult().getFieldError();
String errorMsg = fieldError.getDefaultMessage();
return new BaseJsonResponse().error(1, fieldError.getField() + errorMsg);
} else//TODO 这里可以定制化业务异常
return new BaseJsonResponse().error(1, e.getMessage());
}
}
demo代码
@RequestMapping(value = "/xxx.json", method = RequestMethod.POST)
public @ResponseBody BaseResponse xxx(@Valid @RequestBody XxxReq req) {
}
@Data
public class XxxReq {
@NotNull
private Integer id;
@NotNull
private Integer userId;
@NotNull
@Pattern(regexp = GlobalVar.DATE_PATTERN_YMD, message = GlobalVar.DATE_PATTERN_YMD_ERROR)
private String date;
@NotNull
private Integer type;
}
效果
2019-09-26 10:48:02.872 [http-apr-8080-exec-1] INFO
c.q.filter.HttpLogTraceFilter - reqBody={"id":123,"name":"xx"}
2019-09-26 10:48:02.872 [http-apr-8080-exec-1] INFO
c.q.filter.HttpLogTraceFilter - respBody={"result":1,"message":"date不能为null"}