SpringBoot全局异常处理

曾经终败给现在 2023-02-25 08:34 147阅读 0赞

一、场景介绍

SpringBoot已经有一定的异常处理了,但是对于业务处理有些不合适的,因此我们需要对这些异常进行统一的捕获并处理。

实体和日志用的是lombok插件,相关注解不清楚的可以百度一下,个人感觉挺好用的,推荐使用。

二、自定义业务异常类

自定义一个异常类,用于处理发生的业务异常(BusinessException.java)。

  1. package com.blog.exception;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Builder;
  4. import lombok.Data;
  5. import lombok.NoArgsConstructor;
  6. /**
  7. * @path:com.blog.exception.BusinessException.java
  8. * @className:BusinessException.java
  9. * @description:业务异常处理
  10. * @author:tanyp
  11. * @dateTime:2020/7/11 11:52
  12. * @editNote:
  13. */
  14. @Data
  15. @Builder
  16. @AllArgsConstructor
  17. @NoArgsConstructor
  18. public class BusinessException extends RuntimeException {
  19. private String msg;
  20. }

三、全局异常处理

1、对捕获的异常进行简单的二次处理,返回异常的信息(GlobalException.java)

  1. package com.blog.exception;
  2. import com.blog.constant.Constants;
  3. import com.blog.utils.Msg;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.web.bind.annotation.ControllerAdvice;
  6. import org.springframework.web.bind.annotation.ExceptionHandler;
  7. import org.springframework.web.bind.annotation.ResponseBody;
  8. /**
  9. * @path:com.blog.exception.GlobalException.java
  10. * @className:GlobalException.java
  11. * @description:全局异常处理
  12. * @author:tanyp
  13. * @dateTime:2020/7/11 11:50
  14. * @editNote:
  15. */
  16. @Slf4j
  17. @ControllerAdvice
  18. public class GlobalException {
  19. @ExceptionHandler(value = Exception.class)
  20. @ResponseBody
  21. public Msg handle(Exception e) {
  22. if (e instanceof BusinessException) {
  23. log.error("业务逻辑处理异常:{}", ((BusinessException) e).getMsg());
  24. e.printStackTrace();
  25. return Msg.error().add(((BusinessException) e).getMsg());
  26. }
  27. log.error("系统异常:{}", e);
  28. return Msg.error().add(Constants.ERROR_EXCEPTION);
  29. }
  30. }

2、统一返回值封装类(Msg.java)

  1. @Data
  2. public class Msg {
  3. private Integer code;
  4. private String message;
  5. private Object data = new Object();
  6. public static Msg success() {
  7. Msg result = new Msg();
  8. result.setCode(200);
  9. result.setMessage("success");
  10. return result;
  11. }
  12. public static Msg error() {
  13. Msg result = new Msg();
  14. result.setCode(500);
  15. result.setMessage("error");
  16. return result;
  17. }
  18. public Msg add(Object value) {
  19. this.data = value;
  20. return this;
  21. }
  22. }

四、测试

1、根据用户名称查询用户信息,判断是否存在,不存在则抛异常返回:

  1. @Slf4j
  2. @Service
  3. public class UserServiceImpl implements UserService {
  4. @Autowired
  5. private UserMapper userMapper;
  6. @Override
  7. public User qryByUserName(String userName) {
  8. User user = userMapper.qryByUserName(userName);
  9. if (Objects.isNull(user)) {
  10. throw new BusinessException("用户不存在");
  11. }
  12. return user;
  13. }
  14. }

2、controller直接放回查询结果,代码非常简单,没有什么业务性的,就不在这里赘述了。

3、用postman请求测试

测试结果:
在这里插入图片描述
打印日志信息:

  1. 2020-07-11 13:33:27,936 [http-nio-8008-exec-3] INFO com.alibaba.druid.pool.DruidDataSource.init 1003 - {dataSource-1} inited
  2. 2020-07-11 13:33:28,243 [http-nio-8008-exec-3] DEBUG com.blog.mapper.UserMapper.qryByUserName.debug 143 - ==> Preparing: select id,username,password,type,email,birthday,phone,sex,update_time,create_time from user where username = ?
  3. 2020-07-11 13:33:28,290 [http-nio-8008-exec-3] DEBUG com.blog.mapper.UserMapper.qryByUserName.debug 143 - ==> Parameters: zhangsan(String)
  4. 2020-07-11 13:33:28,410 [http-nio-8008-exec-3] DEBUG com.blog.mapper.UserMapper.qryByUserName.debug 143 - <== Total: 0
  5. 2020-07-11 13:33:28,416 [http-nio-8008-exec-3] ERROR com.blog.exception.GlobalException.handle 26 - 业务逻辑处理异常:用户不存在
  6. BusinessException(msg=用户不存在)
  7. at com.blog.service.impl.UserServiceImpl.qryByUserName(UserServiceImpl.java:37)
  8. at com.blog.controller.LoginController.login(LoginController.java:52)
  9. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  10. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
  11. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  12. at java.lang.reflect.Method.invoke(Method.java:498)

发表评论

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

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

相关阅读

    相关 springboot 全局异常处理

    在实际项目中,我们经常会遇到关于异常处理的问题,异常是不能抛给用户看的,所以就要求我们给用户一个友好的提示或者在抛出异常之前捕获异常。有时异常中包含提示信息,所以我们只能在控制

    相关 Springboot 全局异常处理

    最近在做项目时需要对异常进行全局统一处理,主要是一些分类入库以及记录日志等,因为项目是基于Springboot的,所以去网络上找了一些博客文档,然后再结合项目本身的一些特殊需求