软件编程
位置:首页>> 软件编程>> java编程>> SpringMVC项目异常处理机制详解

SpringMVC项目异常处理机制详解

作者:mzz124  发布时间:2023-03-12 13:13:25 

标签:SpringMVC,异常,处理,机制

1、异常分类

通常分为三类:系统异常(SystemException),业务异常(BusinessException)和其他异常(Exception)

  • 业务异常指由于用户的不规范操作产生的异常,如不合法的参数传入

  • 系统异常指项目运行过程中可预计但无法避免的异常,如数据库宕机

  • 其他异常指开发者未曾预料到的异常

2、自定义项目业务异常

public class BusinessException extends RuntimeException {
   private Integer code;
   public BusinessException(Integer code, String message) {
       super(message);
       this.code = code;
   }
   public Integer getCode() {
       return code;
   }
   public void setCode(Integer code) {
       this.code = code;
   }
}

3、自定义项目系统异常

public class SystemException extends RuntimeException {
   private Integer code;
   public SystemException(Integer code, String message, Throwable cause) {
       super(message, cause);
       this.code = code;
   }
   public Integer getCode() {
       return code;
   }
   public void setCode(Integer code) {
       this.code = code;
   }
}

4、其他异常

其他异常是未预料到会发生的异常,除了上面的两种异常外的所有异常都可以当作其他异常,由于所有的异常都继承自 Exception 类,所以就把 Exception 作为其他异常

5、异常代码

提高代码可读性,便于开发,自行协商设置即可

public class Code {
   public static final Integer SYSTEM_ERR = 50001;
   public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
   public static final Integer SYSTEM_UNKNOWN_ERR = 59999;
   public static final Integer BUSINESS_ERR = 60001;
}

6、异常处理器

由于系统异常和其他异常需要工作人员对系统进行调整,所以出现这两种异常时通常要记录进日志,并将相关信息发送给运维人员和开发人员,而业务异常则不需要

@RestControllerAdvice
public class ProjectExceptionAdvice {
   // 拦截处理业务异常
   @ExceptionHandler(BusinessException.class)
   public Result doBusinessException(BusinessException ex) {
       return new Result(ex.getCode(), null, ex.getMessage());
   }
   // 拦截处理系统异常
   @ExceptionHandler(SystemException.class)
   public Result doSystemException(SystemException ex) {
       // 记录日志,发送消息给运维人员,发送邮件给开发人员
       return new Result(ex.getCode(), null, ex.getMessage());
   }
   //拦截处理其他异常
   @ExceptionHandler(Exception.class)
   public Result doException(Exception ex) {
       // 记录日志,发送消息给运维人员,发送邮件给开发人员
       return new Result(Code.SYSTEM_UNKNOWN_ERR, null, "系统繁忙,请联系管理员。");
   }
}

7、异常发生

以业务层为例,查找 id 小于等于 0 时认为参数非法,可以抛出业务异常。对于系统异常,使用 try catch 语句包裹可能会出现异常的语句,捕获异常并包装成自定义的异常,再将其抛出

@Service
public class BookServiceImpl implements BookService {
   @Autowired
   private BookDao bookDao;
   @Override
   public Book getById(Integer id) {
       // id 小于等于零时抛出业务异常
       if (id <= 0) {
           throw new BusinessException(Code.BUSINESS_ERR, "参数不合法,请检查传入参数!");
       }
       // 将可能出现的异常进行包装,装换成自定义异常
       try {
           int x = 1 / 0;  // 加入此行出现异常
           return bookDao.getById(id); // 模拟数据库访问出错
       } catch (Exception e) {
           throw new SystemException(Code.SYSTEM_TIMEOUT_ERR, "数据库访问异常,请稍后重试!", e);
       }
   }
}

最后可以用 Postman 发送对应的请求进行测试

来源:https://blog.csdn.net/Cey_Tao/article/details/126468905

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com