• SSM整合-异常处理器及项目异常处理方案


    目录

    一、异常处理器

    二、项目异常处理方案

    项目异常分类

    项目异常处理方案

    项目异常处理


    一、异常处理器

    程序开发过程中不可避免的会遇到异常现象

    出现异常现象的常见位置与常见诱因如下:

    ■ 框架内部抛出的异常:因使用不合规导致

    ■ 数据层抛出的异常:因外部服务器故障导致(例如:服务器访问超时)

    ■ 业务层抛出的异常:因业务逻辑书写错误导致(例如:遍历业务书写操作,导致索引异常等)

    ■ 表现层抛出的异常:因数据收集、校验等规则导致(例如:不匹配的数据类型间导致异常)

    ■ 工具类抛出的异常:因工具类书写不严谨不够健壮导致(例如:必要释放的连接长期未释放等)

    1、各个层级出现异常,异常处理代码书写在哪一层?

    所有的异常均抛出到表现层进行处理

    2、表现层处理异常,每个方法单独书写,代码书写量巨大且意义不强,如何解决?

    AOP思想

    异常处理器

    集中的、统一的处理项目中出现的异常

    1. @RestControllerAdvice
    2. public class ProjectExceptionAdvice{
    3. @ExceptionHandler(Exception.class)
    4. public Result doException(Exception ex){
    5. return new Result(666,null);
    6. }
    7. }

    名称:@RestControllerAdvice

    类型:类注解

    位置:Rest风格开发的控制器增强类定义上方

    作用:为Rest风格开发的控制器类做增强

    范例:

    1. @RestControllerAdvice
    2. public class ProjectExceptionAdvice{
    3. }

    说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能

    名称:@ExceptionHandler

    类型:方法注解

    位置:专用于异常处理的控制器方法上方

    作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行

    范例:

    1. @RestControllerAdvice
    2. public class ProjectExceptionAdvice{
    3. @ExceptionHandler(Exception.class)
    4. public Result doException(Exception ex){
    5. return new Result(666,null);
    6. }
    7. }

    说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

    异常处理器处理效果比对:

    无异常时:

     有异常时:

     二、项目异常处理方案

    项目异常分类

    业务异常(BusinessException)

    规范的用户行为产生的异常

    不规范的用户行为产生的异常

    系统异常(SystemException)

    项目运行过程中可预计且无法避免的异常

    其他异常(Exception)

    编程人员未预期到的异常

    项目异常处理方案

    业务异常(BusinessException)

    发送对应消息传递给用户,提醒规范操作

    系统异常(SystemException)

    发送固定消息传递给用户,安抚用户

    发送特定消息给运维人员,提醒维护

    记录日志

    其他异常(Exception)

    发送固定消息传递给用户,安抚用户

    发送特定消息给编程人员,提醒维护(纳入预期范围内)

    记录日志

    项目异常处理

    1、自定义项目异常系统级异常

    1. //自定义异常处理器,用于封装异常信息,对异常进行分类
    2. public class SystemException extends RuntimeException{
    3. private Integer code;
    4. public Integer getCode() {
    5. return code;
    6. }
    7. public void setCode(Integer code) {
    8. this.code = code;
    9. }
    10. public SystemException(Integer code, String message) {
    11. super(message);
    12. this.code = code;
    13. }
    14. public SystemException(Integer code, String message, Throwable cause) {
    15. super(message, cause);
    16. this.code = code;
    17. }
    18. }

    2、自定义项目业务级异常

    1. //自定义异常处理器,用于封装异常信息,对异常进行分类
    2. public class BusinessException extends RuntimeException{
    3. private Integer code;
    4. public Integer getCode() {
    5. return code;
    6. }
    7. public void setCode(Integer code) {
    8. this.code = code;
    9. }
    10. public BusinessException(Integer code, String message) {
    11. super(message);
    12. this.code = code;
    13. }
    14. public BusinessException(Integer code, String message, Throwable cause) {
    15. super(message, cause);
    16. this.code = code;
    17. }
    18. }

    3、自定义异常编码(持续补充)

    1. public class Code {
    2. public static final Integer SYSTEM_UNKNOW_ERROR = 50001;
    3. public static final Integer SYSTEM_TIMEOUT_ERROR = 50002;
    4. public static final Integer PROJECT_VALIDATE_ERROR = 60001;
    5. public static final Integer PROJECT_BUSINESS_ERROR = 60002;
    6. }

    4、触发自定义异常

    1. @Service
    2. public class BookServiceImpl implements BookService {
    3. @Autowired
    4. private BookDao bookDao;
    5. public Book getById(Integer id) {
    6. //模拟业务异常,包装成自定义异常
    7. if(id < 0){
    8. throw new BusinessException(Code.PROJECT_BUSINESS_ERROR,"请勿进行非法操作!");
    9. }
    10. return bookDao.getById(id);
    11. }
    12. }

    5、拦截并处理异常

    1. //@RestControllerAdvice用于标识当前类为REST风格对应的异常处理器
    2. @RestControllerAdvice
    3. public class ProjectExceptionAdvice {
    4. //@ExceptionHandler用于设置当前处理器类对应的异常类型
    5. @ExceptionHandler(SystemException.class)
    6. public Result doSystemException(SystemException ex){
    7. //记录日志
    8. //发送消息给运维
    9. //发送邮件给开发人员,ex对象发送给开发人员
    10. return new Result(ex.getCode(),null,ex.getMessage());
    11. }
    12. @ExceptionHandler(BusinessException.class)
    13. public Result doBusinessException(BusinessException ex){
    14. return new Result(ex.getCode(),null,ex.getMessage());
    15. }
    16. //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    17. @ExceptionHandler(Exception.class)
    18. public Result doOtherException(Exception ex){
    19. //记录日志
    20. //发送消息给运维
    21. //发送邮件给开发人员,ex对象发送给开发人员
    22. return new Result(Code.SYSTEM_UNKNOW_ERROR,null,"系统繁忙,请联系管理员!");
    23. }
    24. }

    6、异常处理器效果对比

     

  • 相关阅读:
    利用KerasCV YOLOv8轻松实现目标精确检测
    【NLP】python-docx库简介
    那些年,我们一起发现的Bug
    [开源精品] .NET 定时任务 -- FreeScheduler 支持 cron、持久化、可变定时设置
    openeuler上安装polarismesh集群
    pdf编辑器工具哪个好?好用的pdf编辑器一款就够!
    20231008-20231013 读书笔记
    NLP手札1. 金融信息负面及主体判定方案梳理&代码实现
    animate动画库的使用步骤
    Docker(四):Docker可视化管理工具
  • 原文地址:https://blog.csdn.net/m0_61961937/article/details/125551768