当前位置: 首页 > news >正文

深入理解Java自定义异常与全局异常处理 @RestControllerAdvice

        异常主要是包括编译时的异常运行时的异常。编译时的异常可以通过捕获异常获取,运行时候的异常主要是通过代码规范,或者测试

        Spring Boot提供了两种异常处理方式来统一处理和维护异常信息

        第一种方式是使用@RestControllerAdvice注解与@ExceptionHandler注解配合使用。第二种方式是ErrorController类,因为第一种方式主要是捕获在接口类的异常,如果需要自定义处理特定的HTTP错误代码(404,401),未进入控制器的和自定义错误页面,则需要使用ErrorController。

        一般来说,只使用@RestControllerAdvice+@ExceptionHandler就够了。

  • @ControllerAdvice:可以用来实现对Controller全局异常处理,与传统的基于AOP的方法不同,使用@ControllerAdvice可以捕获所有Controller中抛出的异常,而无需在每个Controller中配置@ExceptionHandler。通过在该类中使用@ExceptionHandler注解,可以根据不同的异常类型定义相应的处理方法。 @ControllerAdvice需要配合@ExceptionHandler一起使用。

  • @RestControllerAdvice是集合了@ControllerAdvice+@ResponseBody的功能,只是以JSON格式返回处理结果。


创建个exception包:在其中创建自定义异常类

自定义异常:

public class SystemException extends RuntimeException {
​private int code;
​private String msg;//获取枚举类中的codepublic int getCode() {return code;}//获取枚举类中的msgpublic String getMsg() {return msg;}
​public SystemException(RespBeanEnum respBeanEnum) {//表示调用父类(RuntimeException)的构造方法,并传入respBeanEnum.getMsg()作为参数super(respBeanEnum.getMsg());this.code = respBeanEnum.getCode();//这个其实是多余的,在super()方法中就已经传了msg,不过便于阅读。this.msg = respBeanEnum.getMsg();}
​
}

        SystemException构造方法的参数是RespBeanEnum:

        定义一个枚举类,列出所有可能的错误类型,并为每个错误类型指定一个对应的错误码和错误消息。然后在自定义异常类中引用该枚举类,并使用其中的错误码和错误消息来初始化异常对象。

public enum RespBeanEnum {   int code;String msg; SUCCESS(200, "操作成功"),ERROR(500, "出现错误");RespBeanEnum(int code, String errorMessage) {this.code = code;this.msg = errorMessage;}public int getCode() {return code;}
​public String getMsg() {return msg;}
}
  • 解释1:

    super(respBeanEnum.getMsg())这个方法是调用父类的构造方法。最上面是:

public Throwable(String message) {fillInStackTrace();detailMessage = message;
}

        它的作用是利用父类的异常处理机制RuntimeExpetion,其包含了父类的一些异常处理机制,如堆栈轨迹,异常链的部分。则得在自定义异常类的构造方法中使用super(msg)

        通过super(respBeanEnum.getMsg())将错误消息传递给父类的构造方法,用于创建一个带有指定错误消息的自定义异常对象 SystemException

通过结合枚举类,可以有以下优势:

  1. 错误分类清晰明确:枚举类可以将各种错误类型进行分类,使得代码的错误处理更具可读性和可维护性。

  2. 统一管理错误信息:在枚举类中定义错误码和错误消息,可以集中管理和维护所有错误信息,方便后续的修改和扩展

  3. 可拓展性:通过扩展枚举类,可以轻松添加新的错误类型,而无需修改和添加大量的代码。

自定义全局异常处理:

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {//处理自定义异常@ExceptionHandler(SystemException.class)public RespBean systemExceptionHandler(SystemException e) {//打印异常信息log.error("出现了异常! {}", e);//从异常对象中获取提示信息封装返回//实际上e.getCode() 和 e.getMsg()返回的值就是枚举类定义的属性值return RespBean.errorResult(e.getCode(), e.getMsg());}//处理其他异常@ExceptionHandler(Exception.class)public RespBean exceptionHandler(Exception e) {//打印异常信息log.error("出现了异常! {}", e);//从异常对象中获取提示信息封装返回return RespBean.errorResult(RespBeanEnum.SYSTEM_ERROR.getCode(), e.getMessage());}
}
ERROR(500, "出现错误"),得到枚举类的code

相关文章:

深入理解Java自定义异常与全局异常处理 @RestControllerAdvice

异常主要是包括编译时的异常和运行时的异常。编译时的异常可以通过捕获异常获取,运行时候的异常主要是通过代码规范,或者测试。 Spring Boot提供了两种异常处理方式来统一处理和维护异常信息。 第一种方式是使用RestControllerAdvice注解与ExceptionHand…...

h5页面跳转微信小程序(最简单的方法|URL Scheme)

文章目录 导文实现获取 URL Scheme加密 URL Scheme获取方式拼接参数 明文 URL Scheme获取方式 实际项目展示:频率限制注意事项开放范围示例代码包 导文 H5页面跳转微信小程序的需求是普遍存在的。由于微信小程序是一种只能在微信内部访问的应用程序,而H5…...

智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于非洲秃鹫算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.非洲秃鹫算法4.实验参数设定5.算法结果6.…...

持续集成交付CICD:Jenkins使用GitLab共享库实现前端项目镜像构建

目录 一、实验 1. GitLab修改项目文件与Harbor环境确认 2.Jenkins使用GitLab共享库实现前端项目镜像构建 3.优化CI流水线封装Harbor账户密码 4.Jenkins再次使用GitLab共享库实现前端项目镜像构建 一、实验 1. GitLab修改项目文件与Harbor环境确认 (1&#xf…...

SQL server 数据库 SQL语句高级用法

1、表的高级查询 use student select * from stuinfo1 -- 使用 in 的子查询 select * from stuinfo where stu_age in ( select stu_age from stuinfo where cla_id 12345 ) select * from stuinfo where stu_age in ( 19 , 20 , 21 , 25 , 23 , 1…...

wavlink 路由器 多处前台RCE漏洞复现

0x01 产品简介 WAVLINK是中国睿因科技(WAVLINK)公司开发的一款路由器。 0x02 漏洞概述 WAVLINK路由器mesh.cgi、nightled.cgi、live-api.cgi等接口处存在命令执行漏洞,攻击者可通过该漏洞获取服务器权限。包含型号WN530HG4、WN531G3、WN572HG3、WN535G3、WN575A4等。 0x…...

互联网中的商品超卖问题及其解决方案:Java中Redis结合UUID的应用

前言 在设计商品下单和库存扣减,你一定遇到过这样的问题,库存扣减为0了,可是消费者还能下单,并将订单信息保存到了数据库里,针对商品超卖问题,作此篇以解决。 随着互联网商业的飞速发展,商品超…...

mysql:查看线程缓存中的线程数量

使用命令show global status like Threads_cached;可以查看线程缓存中的线程数量。 例如,查询线程缓存中的线程数量如下: 然后启动应用程序,使用连接,查询如下: 由查询结果可以看到,线程缓存中的线程数量…...

线性表,也是Java中数组的知识点!

线性表定义: 由n (n≥0)个数据特性相同的元素构成的有限序列称为线性表,(n0)的时候被称为空表。 线性表的顺序表示 线性表的顺序存储又被称为顺序表 优点 无需为表示表中元素之间的逻辑关系而增加额外的存储空间可以随意读取任意位置的元素 缺点 插入…...

java使用面向对象实现图书管理系统

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …...

2023 英特尔On技术创新大会直播 |我感受到的“芯”魅力

文章目录 每日一句正能量前言AI时代,云与PC结合为用户带来更好体验全新处理器,首次引入针对人工智能加速的NPU大模型时代,软硬结合带来更好训练成果后记 每日一句正能量 成长是一条必走的路路上我们伤痛在所难免。 前言 在2023年的英特尔On技…...

Atium Designer 23 全新功能-丝印制备,解决DFM问题

进行PCB设计时需要养成良好的设计习惯,才能保证后期的生产效果。例如整板上需要保证丝印跟阻焊的间距规则避免产生丝印重叠造成的PCB制造设计(DFM)问题。丝印重叠阻焊的影响有如下: 1)PCB板后期打样,一般是…...

Nginx快速入门:安装目录结构详解及核心配置解读(二)

0. 引言 上节我们讲解了nginx的应用场景和安装,本节继续针对nginx的各个目录文件进行讲解,让大家更加深入的认识nginx。并通过一个实操案例,带大家来实际认知nginx的核心配置 1. nginx安装目录结构 首先nginx的默认安装目录为:…...

测试TensorFlow/PyTorch的GPU版本是否启用

文章目录 1. Pytorch测试代码2. TensorFlow测试代码 后续遇到好的会不断更新。。。 1. Pytorch测试代码 import torch def gpu_is_available():print(\nGPU details:)print(f gpu_is_available : , torch.cuda.is_available())print(f cuda_device_count : , t…...

字符串逆序输出

逆序输出就是本来abc输出的,然后我想让他输出成cba,那么我们还是要用到for循环,只不过原先是从零开始往上加,这回呢,是从上面往下减 我们观察上面这个图片,我们想要输出olleh,那么我们就要从4开…...

期货平仓日历(期货平仓日期汇总)

什么是期货平仓日历? 期货是一种高风险高收益的投资品种。而期货交易不同于股票等其他投资品种的交易,期货交易需要在一定时间内才能买卖。而期货平仓日历就是指期货交易中规定的所有合约的平仓日期汇总。 常见期货平仓日期和时间? 不同的…...

计算机网络-进阶

目录 易混淆物理层数据链路层网络层nat如何实现私有ip通信IP数据报 格式解析tcp 连接tcp流量控制滑动窗口拥塞控制 报文捕获 wireshark路由模拟器 enspcdn代理服务器 VS cdn VS web cache 计算机有了物理地址,为什么还要有ip地址?单播 多播 广播 传输层会…...

LED恒流驱动芯片SM2188EN:满足LED灯具出口欧盟所需的ERP能效认证标准和要求

LED灯具是一种节能环保的照明产品,因其高效节能、长寿命等优点而备受消费者青睐,成为照明市场的主流产品。作为LED灯具出口欧盟市场的必备条件,ERP能效认证标准和要求对LED灯具的能效性能提出了严格的要求。 首先,ERP能效认证标准…...

RocketMQ系统性学习-RocketMQ原理分析之消费者的接收消息流程

🌈🌈🌈🌈🌈🌈🌈🌈 【11来了】文章导读地址:点击查看文章导读! 🍁🍁🍁🍁🍁🍁&#x1f3…...

butterfly蝴蝶分类

一、分类原因 由于植物分类所使用的数据集存在一定问题,修改起来比较麻烦,本次采用kaggle的ButterflyMothsImageClassification数据集,对100这种蝴蝶进行分类。 二、100中蝴蝶类别 ‘ADONIS’,‘AFRICAN GIANT SWALLOWTAIL’,‘AMERICAN S…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Linux云原生安全:零信任架构与机密计算

Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)

RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键&#xff…...

Pydantic + Function Calling的结合

1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...

[USACO23FEB] Bakery S

题目描述 Bessie 开了一家面包店! 在她的面包店里,Bessie 有一个烤箱,可以在 t C t_C tC​ 的时间内生产一块饼干或在 t M t_M tM​ 单位时间内生产一块松糕。 ( 1 ≤ t C , t M ≤ 10 9 ) (1 \le t_C,t_M \le 10^9) (1≤tC​,tM​≤109)。由于空间…...