SpringMvc异常处理

异常处理器

编写异常处理器

@RestControllerAdvice  //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {

    //统一处理所有的Exception异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        return new Result(666,null);
    }
}

@RestControllerAdvice注解介绍

  • 名称:@RestControllerAdvice
  • 类型:类注解
  • 位置:Rest风格开发的控制器增强类定义上方
  • 作用:为Rest风格开发的控制器类做增强
  • 说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能

2.2.3 @ExceptionHandler注解介绍

  • 名称:@ExceptionHandler
  • 类型:方法注解
  • 位置:专用于异常处理的控制器方法上方
  • 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行
  • 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

项目异常处理方案

1 项目异常分类

  • 业务异常(BusinessException)
  • 规范的用户行为产生的异常
  • 不规范的用户行为操作产生的异常
  • 系统异常(SystemException)
  • 项目运行过程中可预计且无法避免的异常
  • 其他异常(Exception)
  • 编程人员未预期到的异常### 2 项目异常处理方案
  • 业务异常(BusinessException)
  • 发送对应消息传递给用户,提醒规范操作
  • 系统异常(SystemException)
  • 发送固定消息传递给用户,安抚用户
  • 发送特定消息给运维人员,提醒维护
  • 记录日志
  • 其他异常(Exception)
  • 发送固定消息传递给用户,安抚用户
  • 发送特定消息给编程人员,提醒维护(纳入预期范围内)
  • 记录日志

3 项目异常处理代码实现

3.1 根据异常分类自定义异常类

3.1.1 自定义项目系统级异常
//自定义异常处理器,用于封装异常信息,对异常进行分类
public class SystemException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public SystemException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public SystemException(Integer code, String message, Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}
3.1.2 自定义项目业务级异常
//自定义异常处理器,用于封装异常信息,对异常进行分类
public class BusinessException extends RuntimeException{
    private Integer code;

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public BusinessException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public BusinessException(Integer code,String message,Throwable cause) {
        super(message, cause);
        this.code = code;
    }
}

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

public class Code {

    //之前其他状态码省略没写,以下是新补充的状态码,可以根据需要自己补充

    public static final Integer SYSTEM_ERR = 50001;
    public static final Integer SYSTEM_TIMEOUT_ERR = 50002;
    public static final Integer SYSTEM_UNKNOW_ERR = 59999;
    public static final Integer BUSINESS_ERR = 60002;

}

3.3 触发自定义异常

@Service
public class BookServiceImpl implements BookService {
    @Autowired
    private BookDao bookDao;

    //在getById演示触发异常,其他方法省略没有写进来
    public Book getById(Integer id) {
        //模拟业务异常,包装成自定义异常
        if(id

3.4 在异常通知类中拦截并处理异常

@RestControllerAdvice //用于标识当前类为REST风格对应的异常处理器
public class ProjectExceptionAdvice {
    //@ExceptionHandler用于设置当前处理器类对应的异常类型
    @ExceptionHandler(SystemException.class)
    public Result doSystemException(SystemException ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    @ExceptionHandler(BusinessException.class)
    public Result doBusinessException(BusinessException ex){
        return new Result(ex.getCode(),null,ex.getMessage());
    }

    //除了自定义的异常处理器,保留对Exception类型的异常处理,用于处理非预期的异常
    @ExceptionHandler(Exception.class)
    public Result doOtherException(Exception ex){
        //记录日志
        //发送消息给运维
        //发送邮件给开发人员,ex对象发送给开发人员
        return new Result(Code.SYSTEM_UNKNOW_ERR,null,"系统繁忙,请稍后再试!");
    }
}

Original: https://www.cnblogs.com/icemomo/p/16210120.html
Author: 冰莫莫
Title: SpringMvc异常处理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/580391/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • VirtrualBox使用已存在的镜像创建虚拟机

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/41605443 再将一个已经存在的虚拟机镜像拷贝为另一个新的虚拟机镜像后,…

    Java 2023年5月30日
    063
  • SpringCloud-Consul

    1. Consul 简介 Consul是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服 务注册与发现的方案,Consul 的方案更&#…

    Java 2023年6月7日
    064
  • 基于数据库的代码自动生成工具,生成JavaBean、生成数据库文档、生成前后端代码等(v6.9.0版)

    TableGo_20200520 v6.9.0 正式版发布,此次版本更新如下:1、新增对JDK9及以上版本Java环境的支持2、生成JavaBean更名为生成数据模型并且提供了C#…

    Java 2023年6月9日
    071
  • linux下启动MongoDB权限不够

    bash: ./mongod: 权限不够 解决办法: 在MongoDB安装目录下: chmod -R 740 bin Original: https://www.cnblogs.c…

    Java 2023年6月15日
    075
  • SpringBoot:Java High Level REST Client 搜索 API

    SearchRequest用于与搜索文档,聚合,建议有关的任何操作,还提供了在结果文档上请求突出显示的方法. 在最基本的形式中,我们可以向请求添加查询: searchRequest…

    Java 2023年5月29日
    080
  • List的同步类比较

    TL;NRs CopyOnWriteArrayList类在多线程顺序读取上有很大的优势,但在随机读取上反而有较大的劣势,且在写入方面性能极差。 Vector类在顺序读取方面性能较差…

    Java 2023年6月9日
    068
  • 《Spring实战》学习笔记-第五章:构建Spring web应用

    之前一直在看《Spring实战》第三版,看到第五章时发现很多东西已经过时被废弃了,于是现在开始读《Spring实战》第四版了,章节安排与之前不同了,里面应用的应该是最新的技术。 本…

    Java 2023年5月29日
    073
  • List与Set

    List集合是Collection集合的子接口,其中的元素有序,并且可重复,元素可以通过下标访问。 接囗特有且常用的方法 1.add(int index, E element) v…

    Java 2023年6月5日
    087
  • 栈 栈的介绍 栈是限制插入和删除只能在一个位置上进行的线性表。其中,允许插入和删除的一端位于表的末端,叫做栈顶(top),不允许插入和删除的一端叫做栈底(bottom)。对栈的基本…

    Java 2023年6月14日
    069
  • el-form中数组嵌套对象的验证

    <el-form ref="addData" :model="addData" :rules="addDataRules&q…

    Java 2023年6月7日
    082
  • Spring Bean的作用域

    Spring Bean的作用域或者说范围主要有五种: 作用 描述 singleton 在spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,bean作用域范围的…

    Java 2023年6月14日
    070
  • CocosCreator实现微信排行榜

    1. 概述 不管是在现实生活还是当今游戏中,各式各样的排名层出不穷。如果我们做好一款游戏,却没有实现排行榜,一定是不完美的。排行榜不仅是玩家了解自己实力的途径,也是游戏运营刺激用户…

    Java 2023年6月13日
    059
  • Mysql优化

    1、选取最适用的字段属性MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快。因此,在创建表的时候,为了获得更好的性能,我们可以将表…

    Java 2023年6月9日
    067
  • Spring Cloud Consul 实现服务注册和发现

    Spring Cloud 是一个基于 Spring Boot 实现的云应用开发工具,它为基于 JVM 的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全…

    Java 2023年5月30日
    068
  • 【Java面试手册-基础篇】能否声明main()方法为private或protected,或者不用访问修饰符?

    答案是否定的,main()方法必须public,不能定义main()方法为private和protected,也不能不用访问修饰符。 这是为了能让JVM访问main()方法,如果不…

    Java 2023年6月8日
    073
  • Nginx location匹配规则

    url匹配规则 = : 表示精确匹配后面的url ~ : 表示正则匹配,但是区分大小写 ~* : 正则匹配,不区分大小写 ^~ : 表示普通字符匹配,如果该选项匹配,只匹配该选项,…

    Java 2023年5月30日
    086
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球