全局异常处理
在开发过程中,不管是Dao、Servie、Controller,层都有可能发生异常,对于异常处理,通常是try-catch或者直接throw,这会让try-catch的代码在代码中任意出现,系统的代码耦合度高,代码不美观,统一异常处理可以美化代码。
全局异常处理不仅可以处理java中自带的异常,还可以处理自定义异常类。
全局异常处理编写流程
1.编写自定义异常类
2.编写全局异常处理类
3.在业务代码中抛出异常
1.编写自定义异常类
public class NotLoginException extends Exception{
//编写一个无参构造和有参构造
public NotLoginException(){
super();
}
public NotLoginException(String msg){
super(msg);
}
}
2.编写全局异常处理类
@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 参数填写想要捕获的异常
3.在业务代码中抛出自定义异常
@Override
public 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("用户未登录");//使用异常捕获,可以为前端返回自定义的信息
}
最后运行程序就可以在运行中捕获异常并向前端返回数据了