Spring Boot:异常统一处理

忘是亡心i 2021-12-22 12:41 682阅读 0赞

一:前言

这里先对需要使用到的注解或者类进行说明,顺便理清楚条理。
@ExceptionHandler:注解使用在方法上,值为指定某个异常,当该方法所在的controller出现的异常与注解的异常对应,则会触发注解的方法。
下面这个controller一旦出现异常都会将异常捕获转给该方法进行处理

  1. @RestController
  2. @RequestMapping("user")
  3. public class UserController {
  4. @ExceptionHandler(value = Exception.class)
  5. public void solveException(){
  6. //异常处理逻辑
  7. }
  8. }

@controllerAdvice: 注解在类上,注解的类会注册到spring容器中,类中可有三种注解,@ExceptionHandler,@InitBinder,@ModelAttribute。该类下只要是注解上面三个注解的方法就是让把方法应用到程序中所有带有@RequesMapping注解的方法上。

流程 :

  1. 自定义一个自己的异常
  2. 声明带有@ControllerAdvice的类和@ExceptionHandler的方法,将@ExceptionHandler的方法应用到所有controller。
  3. 声明一个返回结果类
  4. 声明一个枚举类,用来包含可能出现的异常类型

二:Demo

自定义异常:

  1. @Data
  2. @AllArgsConstructor
  3. public class MyException extends RuntimeException{
  4. private Integer code;
  5. private String msg;
  6. public MyException(ResultEnum resultEnum){
  7. this.msg = resultEnum.getMsg();
  8. this.code = resultEnum.getCode();
  9. }
  10. }

自定义返回结果:

  1. @Data
  2. @AllArgsConstructor
  3. @NoArgsConstructor
  4. public class Result {
  5. private int code;
  6. private String msg;
  7. }

枚举类:

  1. public enum ResultEnum {
  2. UNKNOW_ERROR(-1,"未知错误"),
  3. USER_ERROR(-2,"用户信息错误"),
  4. SUCCESS(0,"成功");
  5. private Integer code;
  6. private String msg;
  7. ResultEnum(Integer code, String msg) {
  8. this.code = code;
  9. this.msg = msg;
  10. }
  11. //省略getter和setter
  12. }

工具类:

  1. public class ResultUtil {
  2. public static Result error(Integer code, String msg) {
  3. Result result = new Result();
  4. result.setCode(code);
  5. result.setMsg(msg);
  6. return result;
  7. }
  8. }

自定义异常捕获类:

  1. @ControllerAdvice
  2. @Slf4j
  3. public class MyExceptionHandler {
  4. //接收的是Exception,也就是只要是异常都会执行这方法
  5. @ExceptionHandler(value=Exception.class)
  6. @ResponseBody
  7. public Result handle(Exception e){
  8. if(e instanceof MyException){
  9. MyException myException = (MyException) e;
  10. return ResultUtil.error(myException.getCode(),myException.getMsg());
  11. }else{
  12. return ResultUtil.error(-1,"未知错误");
  13. }
  14. }
  15. }

controller类:

  1. @RestController
  2. @RequestMapping("user")
  3. public class UserController {
  4. @GetMapping("exception")
  5. public void catchException() throws Exception{
  6. throw new MyException(ResultEnum.USER_ERROR);
  7. }
  8. }

流程:

  1. 我们访问http://localhost:8080/user/exception来访问该方法,并抛出我们自定义的异常,通过枚举类来进行对异常信息的集合。
  2. 通过自定义的异常捕获类,来进行对异常的捕获,执行方法。
  3. 异常捕获类的方法中,通过ResultUtil工具类来进行生成Result对象返回。

发表评论

表情:
评论列表 (有 0 条评论,682人围观)

还没有评论,来说两句吧...

相关阅读