设为首页 - 加入收藏 甘南站长网 (http://www.0941zz.com)- 国内知名站长资讯网站,提供最新最全的站长资讯,创业经验,网站建设等!
热搜: 学习 平台 系统
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

SpringBoot 处理异常的几种常见姿势

发布时间:2019-08-29 17:54 所属栏目:[优化] 来源:java互联网架构
导读:一、使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常 这是目前很常用的一种方式,非常推荐。测试代码中用到了 Junit 5,如果你新建项目验证下面的代码的话,记得添加上相关依赖。 1. 新建异常信息实体类 非必要的类,主要用于包装异常信息。 sr

SpringBoot 处理异常的几种常见姿势

一、使用 @ControllerAdvice 和 @ExceptionHandler 处理全局异常

这是目前很常用的一种方式,非常推荐。测试代码中用到了 Junit 5,如果你新建项目验证下面的代码的话,记得添加上相关依赖。

1. 新建异常信息实体类

非必要的类,主要用于包装异常信息。

src/main/java/com/twuc/webApp/exception/ErrorResponse.java

  1. /**?
  2. ?*?@author?shuang.kou?
  3. ?*/?
  4. public?class?ErrorResponse?{?
  5. ?private?String?message;?
  6. ?private?String?errorTypeName;?
  7. ?public?ErrorResponse(Exception?e)?{?
  8. ?this(e.getClass().getName(),?e.getMessage());?
  9. ?}?
  10. ?public?ErrorResponse(String?errorTypeName,?String?message)?{?
  11. ?this.errorTypeName?=?errorTypeName;?
  12. ?this.message?=?message;?
  13. ?}?
  14. ?......省略getter/setter方法?
  15. }?

2. 自定义异常类型

src/main/java/com/twuc/webApp/exception/ResourceNotFoundException.java

一般我们处理的都是 RuntimeException ,所以如果你需要自定义异常类型的话直接集成这个类就可以了。

  1. /**?
  2. ?*?@author?shuang.kou?
  3. ?*?自定义异常类型?
  4. ?*/?
  5. public?class?ResourceNotFoundException?extends?RuntimeException?{?
  6. ?private?String?message;?
  7. ?public?ResourceNotFoundException()?{?
  8. ?super();?
  9. ?}?
  10. ?public?ResourceNotFoundException(String?message)?{?
  11. ?super(message);?
  12. ?this.message?=?message;?
  13. ?}?
  14. ?@Override?
  15. ?public?String?getMessage()?{?
  16. ?return?message;?
  17. ?}?
  18. ?public?void?setMessage(String?message)?{?
  19. ?this.message?=?message;?
  20. ?}?
  21. }?

3. 新建异常处理类

我们只需要在类上加上@ControllerAdvice注解这个类就成为了全局异常处理类,当然你也可以通过 assignableTypes指定特定的 Controller 类,让异常处理类只处理特定类抛出的异常。

src/main/java/com/twuc/webApp/exception/GlobalExceptionHandler.java

  1. /**?
  2. ?*?@author?shuang.kou?
  3. ?*/?
  4. @ControllerAdvice(assignableTypes?=?{ExceptionController.class})?
  5. @ResponseBody?
  6. public?class?GlobalExceptionHandler?{?
  7. ?ErrorResponse?illegalArgumentResponse?=?new?ErrorResponse(new?IllegalArgumentException("参数错误!"));?
  8. ?ErrorResponse?resourseNotFoundResponse?=?new?ErrorResponse(new?ResourceNotFoundException("Sorry,?the?resourse?not?found!"));?
  9. ?@ExceptionHandler(value?=?Exception.class)//?拦截所有异常,?这里只是为了演示,一般情况下一个方法特定处理一种异常?
  10. ?public?ResponseEntity?exceptionHandler(Exception?e)?{?
  11. ?if?(e?instanceof?IllegalArgumentException)?{?
  12. ?return?ResponseEntity.status(400).body(illegalArgumentResponse);?
  13. ?}?else?if?(e?instanceof?ResourceNotFoundException)?{?
  14. ?return?ResponseEntity.status(404).body(resourseNotFoundResponse);?
  15. ?}?
  16. ?return?null;?
  17. ?}?
  18. }?

4. controller模拟抛出异常

src/main/java/com/twuc/webApp/web/ExceptionController.java

  1. /**?
  2. ?*?@author?shuang.kou?
  3. ?*/?
  4. @RestController?
  5. @RequestMapping("/api")?
  6. public?class?ExceptionController?{?
  7. ?@GetMapping("/illegalArgumentException")?
  8. ?public?void?throwException()?{?
  9. ?throw?new?IllegalArgumentException();?
  10. ?}?
  11. ?@GetMapping("/resourceNotFoundException")?
  12. ?public?void?throwException2()?{?
  13. ?throw?new?ResourceNotFoundException();?
  14. ?}?
  15. }?

【免责声明】本站内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

网友评论
推荐文章