全局异常处理
在开发过程中,不管是Dao、Servie、Controller,层都有可能发生异常,对于异常处理,通常是try-catch或者直接throw,这会让try-catch的代码在代码中任意出现,系统的代码耦合度高,代码不美观,统一异常处理可以美化代码。
全局异常处理不仅可以处理java中自带的异常,还可以处理自定义异常类。
全局异常处理编写流程
1.编写全局异常处理类
2.编写自定义异常类
3.在业务代码中抛出异常
1.编写全局异常处理类
@RestControllerAdvice
public class GlobalExceptionAdvice{@ExceptionHandler(NotLoginException.class)public Result NotLoginExceptionHandler(NotLoginException notLoginException){Result result = new Result();String message = notLoginException.getMessage();result.put("msg", message);result.put("code", 0);return result;}
}
①在全局异常处理类上需要添加注解 @RestControllerAdvice
@RestControllerAdvice是一个组合注解,由@ControllerAdvice、@ResponseBody组成,而@ControllerAdvice继承了@Component,因此@RestControllerAdvice本质上是个Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。
在捕获异常之后也可以返回自定义结果集,返回json字符串
② @ExceptionHandler 参数填写想要捕获的异常
2.编写自定义异常类
public class NotLoginException extends Exception{
//编写一个无参构造和有参构造public NotLoginException(){super();}public NotLoginException(String msg){super(msg);}
}
3.在业务代码中抛出自定义异常
@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {String token = request.getHeader("token");ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();if(Strings.isEmpty(token)){throw new NoTokenException("请求未携带token身份验证令牌");}String s = valueOperations.get(token);if (Strings.isNotEmpty(s)) {JSONObject jsonObject = JSON.parseObject(s);if (jsonObject != null) {return true;}}throw new NotLoginException("用户未登录");//使用异常捕获,可以为前端返回自定义的信息}
最后运行程序就可以在运行中捕获异常并向前端返回数据了