SpringMVC项目异常处理机制详解

 更新时间:2022年08月30日 09:59:03   作者:mzz124  
SpringMVC是一种基于Java,实现了Web MVC设计模式,请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将Web层进行职责解耦。基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,SpringMVC也是要简化我们日常Web开发

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 发送对应的请求进行测试

到此这篇关于SpringMVC项目异常处理机制详解的文章就介绍到这了,更多相关SpringMVC异常处理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java手写线程池之向JDK线程池进发

    Java手写线程池之向JDK线程池进发

    在前面的文章自己动手写乞丐版线程池中,我们写了一个非常简单的线程池实现,这个只是一个非常简单的实现,在本篇文章当中我们将要实现一个和JDK内部实现的线程池非常相似的线程池,需要的可以了解一下
    2022-10-10
  • java防盗链在报表中的应用实例(推荐)

    java防盗链在报表中的应用实例(推荐)

    下面小编就为大家带来一篇java防盗链在报表中的应用实例(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • java模式匹配之蛮力匹配

    java模式匹配之蛮力匹配

    这篇文章主要介绍了java模式匹配之蛮力匹配的相关资料和代码,需要的朋友可以参考下
    2015-05-05
  • java中的DateTime的具体使用

    java中的DateTime的具体使用

    本文主要介绍了java中的DateTime的具体使用,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • java不使用第三变量交换两个变量的值

    java不使用第三变量交换两个变量的值

    这篇文章主要介绍了java不使用第三变量交换两个变量的值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java关键字instanceof的两种用法实例

    Java关键字instanceof的两种用法实例

    这篇文章主要介绍了Java关键字instanceof的两种用法实例,本文给出了instanceof关键字用于判断一个引用类型变量所指向的对象是否是一个类(或接口、抽象类、父类)及用于数组比较,需要的朋友可以参考下
    2015-03-03
  • List转变为逗号分隔的String(Java7和Java8分别实现)

    List转变为逗号分隔的String(Java7和Java8分别实现)

    这篇文章主要介绍了Java7和Java8分别实现List转变为逗号分隔的String,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java中的this、package、import示例详解

    Java中的this、package、import示例详解

    这篇文章主要介绍了Java中的this、package、import,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 如何使用GSON解析JSON数据

    如何使用GSON解析JSON数据

    这篇文章主要介绍了如何使用GSON解析JSON数据,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • 使用Spring Boot+MyBatis框架做查询操作的示例代码

    使用Spring Boot+MyBatis框架做查询操作的示例代码

    这篇文章主要介绍了使用Spring Boot+MyBatis框架做查询操作的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10

最新评论