SpringBoot中的异常处理器

news2025/1/16 8:48:09

我们在以上的开发中,统一使用Result返回固定的数据格式给到前端,但是由于程序可能会出现BUG等问题,会导致最终返回给前端的数据,在异常情况下就又不统一了

为了实现在异常情况出现时,也能正常给前端返回统一的数据格式,我们需要使用 异常处理器

定义异常处理器需要使用@RestControllerAdvice注解,代表被修饰的类是一个可以处理全局异常的类:

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {

    
}

使用了以上注解的类,就可以接收系统中出现的异常了,但是异常出现以后,怎么处理就需要专门的处理方法来处理了.

我们可以定义一个方法,使用@ExceptionHandler注解来修饰,并且标明它可以处理什么类型的异常:

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {

    // 接管异常后,为了能够干点什么,需要定义处理方法进行异常逻辑处理(即,出了问题应该怎么办)
    // 使用@ExceptionHandler注解标明此方法处理的是何种异常
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex) {
        return new Result(Code.ERROR, "出问题啦:" + ex.getMessage(), null);
    }
}

以上被@ExceptionHandler修饰的方法,可以处理任何异常。因为它的参数是Exception.class。

接管异常后,SpringBoot框架会自动把异常处理对象注入到方法形参ex上,我们可以直接使用此异常对象

但是以上使用,@ExceptionHandler(Exception.class)来处理异常,就太宽泛了,怎么能处理更加精确的异常呢?

可以写专门的方法,使用@ ExceptionHandler注解标明接管精准的异常:

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {

    // 如果这里定义了更加精确的异常处理方法
    // 优先会由精确方法处理
    @ExceptionHandler(ArithmeticException.class)
    public Result  doArithmeticException(ArithmeticException ex) {
        return new Result(Code.ERROR, "数学运算错误", null);
    }

    // 接管异常后,为了能够干点什么,需要定义处理方法进行异常逻辑处理(即,出了问题应该怎么办)
    // 使用@ExceptionHandler注解标明此方法处理的是何种异常
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex) {
        return new Result(Code.ERROR, "出问题啦:" + ex.getMessage(), null);
    }
}

如果出现的是ArithmeticException类型的异常,doArithmeticException()方法就会被调用。那么最后的托管的doExeption()方法就不被调用了。

最后还有一个问题,我们总不能在异常处理器中,把所有的异常情况都列出来吧?

那时不可能的,太麻烦了.此时我们可以将异常收纳成自己项目里的异常类型:

定义一个自己的异常类:

@Data
public class BusinessException extends RuntimeException{
    private Integer code;

    // 重写RuntimeException的两个构造方法
    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;
    }

}

在出现异常的地方捕获异常后,再抛出我们自己定义的异常即可.

此时我们就可以统一接收自己的异常了

// 定义一个类,专门用于处理或接管异常
// 为了表明这个类可以专门处理异常,需要添加以下注解
@RestControllerAdvice
public class MyExceptionHandler {

    // 接收我们自己定义的异常
    @ExceptionHandler(BusinessException.class)
    public Result doMyException(BusinessException ex){
        return new Result(ex.getCode(), ex.getMessage(), null);
    }

    // 如果这里定义了更加精确的异常处理方法
    // 优先会由精确方法处理
    @ExceptionHandler(ArithmeticException.class)
    public Result  doArithmeticException(ArithmeticException ex) {
        return new Result(Code.ERROR, "数学运算错误", null);
    }

    // 接管异常后,为了能够干点什么,需要定义处理方法进行异常逻辑处理(即,出了问题应该怎么办)
    // 使用@ExceptionHandler注解标明此方法处理的是何种异常
    @ExceptionHandler(Exception.class)
    public Result doException(Exception ex) {
        return new Result(Code.ERROR, "出问题啦:" + ex.getMessage(), null);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1496871.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mac系统:mysql+jdk+neo4j

mysql 指令 //启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start//停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop //连接MySQL数据库,在进行这一步前要先关掉服务 mysql -u root -p //检查MySQL服务状态 sudo /us…

【Unity】ABB CRB 15000 外部引导运动

一、RobotStudio控制器的文件系统和配置参数 HOME:控制器文件系统的根目录或起始点。配置:机器人控制器的配置设置和参数。外件信息:连接到机器人的外部组件的信息。I/O 系统:输入/输出系统,管理机器人和外部设备之间的…

基于dashscope在线调用千问大模型

前言 dashscope是阿里云大模型服务平台——灵积提供的在线API组件。基于它,无需本地加载大模型,通过在线方式访问云端大模型来完成对话。 申请API key 老规矩:要想访问各家云端大模型,需要先申请API key。 对于阿里云&#x…

uniapp图片涂鸦插件(支持多种涂鸦方式,图片放大缩小)

工程地址https://gitee.com/geshijia/ct-graffiti ct-graffiti涂鸦组件使用说明 参考说明 参考链接:https://github.com/ylyuanlu/yl-graffiti 感谢作者的付出,给我提供了一些思路,并做了如下优化: 增加图片放大缩小移动功能添…

UML简述(项目立项、设计、需求整理必备)

UML目录 前言1、UML概述1.1、基本概念1.2、UML图类型说明1.3、UML的41视图 2、UML图详细图示2.1、类图2.2、对象图2.3、组件图2.4、部署图2.5、包图2.6、用例图2.7、状态图2.8、活动图2.9、时序图2.10、通信图(协作图)2.11、定时图(计时图&am…

08 |「Fragment 」

前言 实践是最好的学习方式,技术也如此。 文章目录 前言一、简介1、是什么2、为什么要有 Fragment3. Fragment 详细解释 二、Fragment 与 Activity 的直观理解三、Fragment 的创建1、Fragment 的创建方式2、Fragment 的增删替查1) 替换(常见&…

哪个牌子宠物空气净化器好?质量好的宠物空气净化器推荐

即使我们很爱自家的宠物,但我们也无法否认处理房间里飘荡的宠物毛发和皮屑,以及那些令人不快的气味(比如地毯上的意外和垃圾桶里的气味)的挑战。对于过敏患者来说,这几乎是无法忍受的。寻找有效的方法来减少这些问题对…

电子邮件怎么发送?如何发送匿名电子邮件?

电子邮件发送的详细步骤?电子邮件的发送方式有哪些? 掌握如何发送电子邮件,尤其是如何发送匿名电子邮件,对于保护个人隐私、进行安全交流具有重要意义。下面,AokSend就来详细探讨一下电子邮件的发送方法以及如何发送匿…

转录组总结

1. 软件安装 2.转录组分析步骤: ① 建立环境 #建立python2.7的环境,大部分的转录组信息都需要在Python2的环境下进行 conda create -n py2env python2.7 source activate py2env ② 获取fastqc报告 #单个报告 fastqc -t 15 /home/yinwen/biosoft/DN…

17-Java解释器模式 ( Interpreter Pattern )

Java解释器模式 摘要实现范例 解释器模式(Interpreter Pattern)实现了一个表达式接口,该接口解释一个特定的上下文 这种模式被用在 SQL 解析、符号处理引擎等 解释器模式提供了评估语言的语法或表达式的方式,它属于行为型模式 …

数据库(mysql)-新手笔记-基本知识点(1)

基本概念 数据库 Database :存储数据的容器 表 Table : 在数据库中存储的基本结构,它由行和列组成 行 Row : 表中的一条记录 列 Column : 表中的字段,定义了数据的类型和约束 数据类型 数据值 如 INT(整型),FLAOT(浮点型) ,DECIMAL (精确小数点) 字符串 如 VARCHAR(可变长度字…

Linux第68步_旧字符设备驱动的一般模板

file_operations结构体中的函数就是我们要实现的具体操作函数。 注意: register_chrdev()和 unregister_chrdev()这两个函数是老版本驱动使用的。现在新字符设备驱动已经不再使用这两个函数,而是使用Linux内核推荐的新字符设备驱动API函数。 1、创建C…

更快更强,Claude 3全面超越GPT4,能归纳15万单词

ChatGPT4和Gemini Ultra被Claude 3 AI模型超越了? 3月4日周一,人工智能公司Anthropic推出了Claude 3系列AI模型和新型聊天机器人,其中包括Opus、Sonnet和Haiku三种模型,该公司声称,这是迄今为止它们开发的最快速、最强…

NLP:自定义模型训练

书接上文,为了完成指定的任务,我们需要额外训练一个特定场景的模型 这里主要参考了这篇博客:大佬的博客 我这里就主要讲一下我根据这位大佬的博客一步一步写下时,遇到的问题: 文中的cfg在哪里下载? 要不…

Jellyfin影音站点搭建并结合内网穿透实现远程观看本地影视资源

文章目录 1. 前言2. Jellyfin服务网站搭建2.1. Jellyfin下载和安装2.2. Jellyfin网页测试 3.本地网页发布3.1 cpolar的安装和注册3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5. 结语 1. 前言 随着移动智能设备的普及,各种各样的使用需求也被开发出来&…

国创证券|沪指震荡微跌,资源股集体拉升,黄金概念持续活跃

7日早盘,两市股指盘中震动下探,创业板指、科创50指数跌超1%,北证50指数跌逾2%;北向资金小幅流出。 截至午间收盘,沪指跌0.16%报3035.04点,深证成指跌0.68%,创业板指跌1.48%,科创50指…

基于redis实现用户登陆

因为session有数据共享问题,不同tomcat服务器中的session不能共享,之后负载均衡就无法实现。所以我们用redis代替session。redis可以被多个tomcat服务器共享,redis基于内存。 之前的session可以看做登陆凭证,本次登陆凭证由sessi…

【Redis】Redis的应用场景

📝个人主页:五敷有你 🔥系列专栏:Redis ⛺️稳中求进,晒太阳 Redis的应用场景: 限流 要求10s内只能访问一次 RequestMapping("xian")public String xianLiu(String sign){String sign1 …

allure怎么生成测试报告简单方法

方法一:import pytest pytest.main([‘-s’,‘./执行文件名.py’,‘–alluredir’,‘./result’]) 方法二:os.system(‘allure generate result -o report --clean’) 1、点击index.html,右上角选择浏览器打开 2、查看界面化测试报告

前端vue项目,引入PingFang SC字体

一,首先需要先获取PingFang SC字体,如果你有 请直接跳到第二步 链接:https://pan.baidu.com/s/1nkmV59kT_hvjK4yPJn1cJA 提取码:n0s1 二,将下载好的PingFang SC字体,放在项目的和样式一起的文件下,如下图 然后再创建一个fonts.scss文件(引入的时候注意路径是否正确)…