以往我们在controller做异常的处理特别零散,几乎只要有异常的地方都要去处理,在springboot的学习中遇到了这样一个集中处理异常的方法。
1.首先建立自己会遇到的各种异常类
(1)业务类异常
public class ServiceException extends RuntimeException { private static final long serialVersionUID = 1L; private int errorCode; public ServiceException(ResultEnum resultEnum) { super(resultEnum.getMsg()); this.errorCode = resultEnum.getState(); } int getErrorCode() { return this.errorCode; } }
(2)@ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理
/** * @author ** */ @ControllerAdvice public class GlobalExceptionHandler { @ExceptionHandler(ServiceException.class) public @ResponseBody BaseRsp handleBusinessException(Exception ex) { if (ex instanceof ServiceException) { return new BaseRsp(((ServiceException) ex).getErrorCode(), ex.getMessage()); } return null; } @ExceptionHandler(BindException.class) public @ResponseBody BaseRsp handleBindException(BindException ex) { StringBuilder sb = new StringBuilder(); for (FieldError fieldError : ex.getFieldErrors()) { sb.append(fieldError.getDefaultMessage()); } return new BaseRsp(400, sb.toString()); } /** * 全局异常处理器,线上环境使用 */ @ExceptionHandler(Exception.class) public @ResponseBody BaseRsp handleException(Exception ex) { ex.printStackTrace(); return new BaseRsp(500, "服务器开小差了,请稍等哦~~"); } }
(eg:例如一下情况就会被捕获)
/** * * @param period * @param count * @return */ public CoinChangePercentTopListWrapperVO getCoinTopListZF(String period, int count) { List<ImmutablePair<String, BigDecimal>> coinIds = redisClient.zRevRangeWithScores(ToplistRedisKey.buildToplistCoinMarketChangePercent(period), 0, count); if (coinIds.isEmpty()) { log.error("Failed to get CoinTopListZF"); throw new ServiceException(ResultEnum.NOT_TOPLIST_DATA); } return buildCoinTopList(coinIds); }(4)参考资源:http://blog.csdn.net/kinginblue/article/details/70186586