千锋扣丁学堂Java培训之SpringBoot使用统一异常处理详解

2019-05-06 13:17:22 2443浏览

今天千锋扣丁学堂Java培训老师给大家分享一篇关于SpringBoot使用统一异常处理详解,下面我们一起来看一下吧。

场景:针对异常处理,我们原来的做法是一般在最外层捕获异常即可,例如在Controller中

@Controller
public class HelloController {
  
  private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
  
  @GetMapping(value = "/hello")
  @ResponseBody
  public Result hello() {
    try {
      //TODO 具体的逻辑省略……
    } catch (Exception e) {
      logger.error("hello接口异常={}", e);
      return ResultUtil.success(-1, "system error", null);
    }
    return ResultUtil.success(0, "success", null);
  }
}

这样的话也能解决部分问题,但是无法获取到自己指定的异常,引入全局统一异常处理的话将会极大的改善代码,减少冗余代码的产生。

自定义异常类:注意要继承自RuntimeException而不是Exception,继承自Exception的话,当抛出自定义异常时spring事务不会回滚

public class GlobalException extends RuntimeException {
  
  private Integer code; //因为我需要将异常信息也返回给接口中,所以添加code区分
  
  public GlobalException(Integer code,String message) {
    super(message);  //把自定义的message传递个异常父类
    this.code = code;
  }
  
  public Integer getCode() {
    return code;
  }
  
  public void setCode(Integer code) {
    this.code = code;
  }
}

自定义统一异常处理器:比较关键的两个注解@ControllerAdvice、@ExceptionHandler

@ControllerAdvice
public class ExceptionHandle {
  
  @ResponseBody  //因为我需要将抛出的异常返回给接口,所以加上此注解
  @ExceptionHandler
  public Result handle(Exception e) {
    if (e instanceof GlobalException) {
      GlobalException ge = (GlobalException) e;
      return ResultUtil.success1(ge.getCode(), ge.getMessage());
    }
    return ResultUtil.success1(-1, "system error!");
  }
  
}

写个测试类测试下

@GetMapping(value = "/hello1")
@ResponseBody
public Result hello(@RequestParam(value = "age", defaultValue = "50", required = false) Integer age) throws GlobalException {
  if (age < 10) {
    throw new GlobalException(ConstantEnum.LESS10.getCode(), ConstantEnum.LESS10.getMsg());
  } else if (age > 50) {
    throw new GlobalException(ConstantEnum.MORE50.getCode(), ConstantEnum.MORE50.getMsg());
  } else {
    return ResultUtil.success1(0, "success");
  }
}

把code、message封装在了ConstantEnum枚举里面,方便统一维护

public enum ConstantEnum {
  
  ERROR(-1, "system error!"),
  SUCCESS(100, "success"),
  LESS10(101, "自定义异常信息-我小于10岁"),
  MORE50(5001, "自定义异常信息-我大于50岁");
  
  private Integer code;
  private String msg;
  
  public Integer getCode() {
    return code;
  }
  
  public String getMsg() {
    return msg;
  }
  
  ConstantEnum(Integer code, String msg) {
    this.code = code;
    this.msg = msg;
  }
}


这样就实现了全局的统一异常处理,非常方便且优雅,快快在你的项目中用起来吧!

以上就是关于千锋扣丁学堂Java培训之SpringBoot使用统一异常处理的全部内容,希望对大家的学习有所帮助,想要了解更多关于Java开发方面内容的小伙伴,请关注扣丁学堂Java培训官网、微信等平台,扣丁学堂IT职业在线学习教育有专业的Java讲师为您指导,此外扣丁学堂老师精心推出的Java视频教程定能让你快速掌握Java从入门到精通开发实战技能。扣丁学堂Java技术交流群:850353792。


                          【扫码进入HTML5VIP免费公开课】  


     【关注微信公众号获取更多学习资料】        【扫码进入HTML5前端开发VIP免费公开课】  



查看更多关于“Java开发资讯”的相关文章>>

标签: Java培训 Java视频教程 Java多线程 Java面试题 Java学习视频 Java开发
微信
微博
15311698296

全国免费咨询热线

邮箱:codingke@1000phone.com

官方群:148715490

北京千锋互联科技有限公司版权所有   北京市海淀区宝盛北里西区28号天丰利商场4层
京ICP备12003911号-6   Copyright © 2013 - 2019
返回顶部 返回顶部