实际开发中,在前后端交互时会出现数据为空,数据异常,空指针,数据越界,登陆过期等异常。在后端给前端传值前我们需要判断是否存在这些异常,如果存在异常,我们需要捕获并打印这些异常的日志。
以下是基于登陆认证的异常处理。
@Slf4j //打印日志
@ControllerAdvice //基于@ControllerAdvice注解的Controller层的全局异常统一处理
public class GlobalException {
@ExceptionHandler(value = UnauthorizedException.class)
@ResponseBody
public Result handler(UnauthorizedException e){
log.error("运行时异常--------------{}"+e.getMessage());
return new Result().setCode(402).setMessage("无权限访问");
}
@ResponseBody
@ExceptionHandler(value = ExpiredCredentialsException.class)
public Result handler(ExpiredCredentialsException e){
log.error("运行时异常--------------{}"+e.getMessage());
return new Result().setCode(401).setMessage("登陆已过期,请重新登陆");
}
@ResponseBody
@ExceptionHandler(value = UnauthenticatedException.class)
public Result handler(UnauthenticatedException e){
log.error("运行时异常--------------{}"+e);
return new Result().setCode(401).setMessage("未登陆");
}
@ResponseBody
@ExceptionHandler(value = UnknownAccountException.class)
public Result handler(UnknownAccountException e) {
log.error("运行时异常:----------------{}", e);
return new Result().setCode(401).setMessage("未登录123");
}
}
@ExceptionHandler():指定出现什么异常后要执行的方法,括号内写具体的异常类,可自定义,这里调用的是授权和认证的异常类。
@ResponseBody:为了能够返回json数据
下面是实际登陆中抛出异常的代码片段演示:
注意:返回结果的封装是运用下列博客中的方法实现
try{
subject.login(jwtToken); //登陆方法
}catch (UnknownAccountException unknownAccountException){ //用户名错误将捕获的异常
return JSON.toJSONString(new Result().setCode(401).setMessage("用户名错误"));
}catch (IncorrectCredentialsException incorrectCredentialsException){ //密码错捕获的异常
return JSON.toJSONString(new Result().setCode(402).setMessage("密码错误"));
}
博客仅仅通过举例的方式演示统一异常处理的运用。
实际上我们可以自定义异常类,或者捕获其他类型的异常来抛出。需要在实际运用中慢慢熟悉,欢迎大家私聊评论,提出建议互相学习!