Springboot 全局异常处理类

全局异常处理

在开发过程中,不管是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.在业务代码中抛出自定义异常

 @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("用户未登录");//使用异常捕获,可以为前端返回自定义的信息
    }

Springboot 全局异常处理类_第1张图片
最后运行程序就可以在运行中捕获异常并向前端返回数据了

你可能感兴趣的:(spring,boot,java,spring)