目录
统一异常处理相关注解`Controller` 层的全局异常统一处理自定义异常类捕捉 `service` 层异常自定义异常类消息类消息类处理工具类统一异常拦截类`service` 层或其他层面抛异常统一异常处理相关注解
@ControllerAdvice
: 声明在类上用于指定该类为控制增强器类,如果想声明返回的结果为RESTFull
风格的数据,需要在声明@ExceptionHandler
注解的方法上同时加上@ResponseBody
@RestControllerAdvice
: 声明在类上用于指定该类为控制增强器类。并声明返回的结果为RESTFull
风格的数据,无需在声明@ExceptionHandler
注解的方法上加@ResponseBody
@ExceptionHandler
: 声明在方法上用于指定需要统一拦截的异常。例如:@ExceptionHandler(value = Exception.class)
Controller
层的全局异常统一处理
返回给前端的是JSON
数据@ControllerAdvicepublic class MyControllerAdvice {// 全局异常捕捉处理@ResponseBody@ExceptionHandler(value = Exception.class)public Map errorHandler(Exception ex) {Map map = new HashMap();map.put("code", 100);map.put("msg", ex.getMessage());return map;}// 拦截捕捉自定义异常 MyException.class@ResponseBody@ExceptionHandler(value = MyException.class)public Map myErrorHandler(MyException ex) {Map map = new HashMap();map.put("code", ex.getCode());map.put("msg", ex.getMsg());return map;}}
基于@ControllerAdvice
注解的全局异常统一处理只能针对于Controller
层的异常,意思是只能捕获到Controller
层的异常,在service
层或其他层面的异常是不能捕获的。有的时候,我们需要业务逻辑时抛出自定义异常,这个时候需要自定义业务异常类
自定义异常类捕捉service
层异常
返回给前端的是JSON
数据自定义异常类
public class BusinessException extends RuntimeException {private Integer code;public Integer getCode() {return code;}public void setCode(Integer code) {this.code = code;}public BusinessException(Integer code,String message) {super(message);this.code = code;}}
消息类
public class ReturnMessage<T> {private Integer code;//错误码private String message;//提示信息private T data;//返回具体内容public ReturnMessage(Integer code, String message, T data) {super();this.code = code;this.message = message;this.data= data;}// 省略get and set方法}
消息类处理工具类
public class ReturnMessageUtil {// 无异常 请求成功并有具体内容返回public static ReturnMessage<Object> sucess(Object object) {ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",object);return message;}// 无异常 请求成功并无具体内容返回public static ReturnMessage<Object> sucess() {ReturnMessage<Object> message = new ReturnMessage<Object>(0,"sucess",null);return message;}// 自定义错误异常信息public static ReturnMessage<Object> error(Integer code,String msg) {ReturnMessage<Object> message = new ReturnMessage<Object>(code,msg,null);return message;}}
统一异常拦截类
@RestControllerAdvicepublic class ExceptionHandle {private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);@ExceptionHandler(value = Exception.class)public ReturnMessage<Object> handle(Exception exception) {if(exception instanceof BusinessException) {BusinessException businessException = (BusinessException)exception;return ReturnMessageUtil.error(businessException.getCode(), businessException.getMessage());}else {logger.error("系统异常 {}",exception);return ReturnMessageUtil.error(-1, "未知异常"+ exception.getMessage());}}}
service
层或其他层面抛异常
throw new BusinessException(100, "这个是自定义异常!")
此时,service
层或其他层面的异常就可以捕捉到了,返回给客户端JSON
类型的异常数据