Spring Boot实现统一异常处理的技术解析

引言

在软件开发过程中,异常处理是非常重要的一环。一个好的异常处理机制可以帮助我们更好地定位问题,提高代码的可维护性和稳定性。Spring Boot作为一款轻量级的Java开发框架,提供了一种简单而高效的方式来实现统一异常处理。本文将详细介绍如何使用Spring Boot实现统一异常处理。

了解异常处理的基本概念

在Java中,异常是程序运行过程中出现的问题,可以分为两大类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。受检异常需要程序员显式地进行处理,而非受检异常则不需要。为了提高代码的可读性和可维护性,我们通常会对异常进行统一的处理。

Spring Boot中的统一异常处理

Spring Boot提供了一个全局的异常处理器(GlobalExceptionHandler),可以捕获所有的异常,并进行统一的处理。要实现统一异常处理。

创建全局统一异常处理类

创建一个自定义的异常处理类,实现ControllerAdvice@RestControllerAdvice注解。这个类将会成为全局的异常处理器。

@ControllerAdvice(basePackages="com.example.controller")
public class GlobalExceptionHandler {@ExceptionHandler(value = {Exception.class})@ResponseBodypublic <T> Resp<T> exceptionHandler(Exception e){//这里先判断拦截到的Exception是不是我们自定义的异常类型if(e instanceof CustomException){CustomException customException = (CustomException)e;return Resp.error(customException.getCode(),customException.getMsg());}//如果拦截的异常不是我们自定义的异常(例如:数据库主键冲突)return Resp.error(500,"服务器端异常");}
}
创建自定义的异常类

首先,我们需要定义一些自定义的异常类,以便更好地区分各种异常情况。例如:

public class CustomException extends RuntimeException {private int code = 500;private String msg = "服务器异常";public CustomException(CustomExceptionCodeMsg customExceptionCodeMsg) {super();this.code = customExceptionCodeMsg.getCode();this.msg = customExceptionCodeMsg.getMsg();}public CustomException(int code, String msg) {super();this.code = code;this.msg = msg;}public int getCode() {return code;}public String getMsg() {return msg;}}
创建统一信息返回类
public class Resp<T> {//服务端返回的错误码private int code = 200;//服务端返回的错误信息private String msg = "success";//我们服务端返回的数据private T data;private Resp(int code, String msg, T data) {this.code = code;this.msg = msg;this.data = data;}public static <T> Resp success(T data) {Resp resp = new Resp(200, "success", data);return resp;}public static <T> Resp success(String msg, T data) {Resp resp = new Resp(200, msg, data);return resp;}public static <T> Resp error(CustomExceptionCodeMsg customExceptionCodeMsg) {Resp resp = new Resp(customExceptionCodeMsg.getCode(), customExceptionCodeMsg.getMsg(), null);return resp;}public static <T> Resp error(int code, String msg) {Resp resp = new Resp(code, msg, null);return resp;}public int getCode() {return code;}public String getMsg() {return msg;}public T getData() {return data;}}
创建一个枚举类型
public enum CustomExceptionCodeMsg {INVALID_CODE(0000, "验证码无效"),USERNAME_NOT_EXISTS(11111, "用户名不存在");private int code;private String msg;public int getCode() {return code;}public String getMsg() {return msg;}CustomExceptionCodeMsg(int code, String msg) {this.code = code;this.msg = msg;}}
创建一个controller
@RestController
public class ExceptionController {@GetMapping("/exception")public Resp<String> exception(String name) {if ("ok".equals(name)) {return Resp.success("成功");}if ("err".equals(name)) {//抛业务相关的异常throw new CustomException(CustomExceptionCodeMsg.USERNAME_NOT_EXISTS);}if ("errcode".equals(name)) {throw new CustomException(CustomExceptionCodeMsg.INVALID_CODE);}if ("0".equals(name)) {int i = 1 / 0;}return Resp.success(name);}@GetMapping("/list")public Resp<List> list() {List<String> list = Arrays.asList("CSDN", "奇遇少年");return Resp.success(list);}
}

运行测试:

使用全局异常处理器的优势:

(1)提高代码的可读性和可维护性。通过将异常处理逻辑集中在一个地方,可以降低代码的复杂度,提高代码的可读性。同时,当需要修改异常处理逻辑时,只需要修改一个地方即可。

(2)提高系统的稳定性。通过全局的异常处理器,我们可以更好地定位和处理异常,避免因为未处理的异常导致系统崩溃。

(3)方便进行日志记录和监控。全局的异常处理器可以方便地记录异常信息,便于开发人员进行调试和排查问题。同时,也可以方便地将异常信息发送到监控系统,进行实时的监控和报警。

结语

通过本文的介绍,你已经学会了如何在Spring Boot中实现统一异常处理。通过定义自定义异常和创建全局异常处理器,我们能够更好地管理和处理应用中的各种异常情况。这不仅提高了代码的可读性和可维护性,还能够为用户提供更友好的错误信息。合理使用自定义异常,将有助于构建一个稳健的应用,为用户提供更加可靠的服务。

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

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

相关文章

springboot 3 + mysql8 + flyway 数据库版本管理

1、flyway flyway官方文档地址&#xff1a;https://documentation.red-gate.com/fd 对于不怎么看文档的我来说&#xff1a; 1&#xff09;flyway是个管理数据库版本的工具&#xff0c;可以对不同环境的sql进行迁移操作。 2&#xff09;优点&#xff1a;初始化、后期数据的管理…

java使用jsch处理软链接判断是否文件夹

前言 这一次主要是碰到一个问题。因为使用jsch去读取文件的时候&#xff0c;有一些文件它是使用软链接制作的一个映射。因为这里面有一个问题。如果它是软链接你就无法判断他到底是文件。还是文件夹&#xff1f;因为他没有提供可以直接读取的方法&#xff0c;用权限信息去判断…

【异常】SecurityException: JCE cannot authenticate the provider BC

升级JDK21出现该异常 JCRCaused by: java.util.jar.JarException: jar:file:/app//service.jar!/BOOT-INF/lib/bcprov-jdk14-138.jar!/ has unsigned entries - org/bouncycastle/LICENSE.class 解决方案 排除 bcprov-jdk14 依赖 可以通过maven插件去查找<dependency>…

Nomogram文献分析:提取数据

前言 今天教大家如何分析Nomogram类型的文章&#xff0c;并使用我们开发的系统零代码提取数据。 系统地址&#xff1a;https://clinicaldata.fun/ 要分析的文章&#xff1a;https://pubmed.ncbi.nlm.nih.gov/36504658/ 。这是一篇典型的mimic-iii数据分析的套路&#xff0c;…

srm-50——攻防世界

可以知道这道题是二类题型&#xff0c;你完成某个事情给你flag 我们输入正确的东西&#xff0c;给“flag” 运行一下可以知道这些关键词 直接关键词在字符串里面 找到运行得到的东西 INT_PTR __stdcall DialogFunc(HWND hDlg, UINT a2, WPARAM a3, LPARAM a4) {HMODULE Mo…

vue.js js 雪花算法ID生成 vue.js之snowFlake算法

随着前端业务越来越复杂&#xff0c;自定义表单数据量比较大&#xff0c;每条数据的id生成则至关重要。想到前期IOS中实现的雪花算法ID&#xff0c;照着其实现JS版本&#xff0c;供大家学习参考。 一、库的建立引入 在你项目中创建一个snowFlake.js的文件&#xff1a;拷贝以下…

【2020】百度校招Java研发工程师笔试卷(第二批)算法题

贴一下我去年9月份写的博客 三道编程题&#xff0c;一道数学题&#xff0c;两道图论&#xff0c;哎嘿嘿&#xff0c;我就是不会做&#xff0c;哎嘿嘿&#xff0c;哭了。。。 一.最小值 牛牛给度度熊出了一个数学题&#xff0c;牛牛给定数字n,m,k&#xff0c;希望度度熊能找到…

PG DBA培训21:PostgreSQL性能优化之基准测试

本课程由风哥发布的基于PostgreSQL数据库的系列课程&#xff0c;本课程属于PostgreSQL Performance Benchmarking&#xff0c;学完本课程可以掌握PostgreSQL性能基准测试基础知识,基准测试介绍,基准测试相关指标,TPCC基准测试基础,PostgreSQL测试工具介绍,PostgreSQL性能基准测…

java常见集合类的区别

ArrayList和LinkedList之间有什么区别&#xff1f; ArrayList和LinkedList都是Java集合框架中的List接口的实现类&#xff0c;它们在实现方式、性能和适用场景等方面存在一些区别。 底层数据结构&#xff1a;ArrayList是基于动态数组的数据结构&#xff0c;而LinkedList则是基…

Python使用graphviz绘制模块间数据流

graphviz官方参考链接&#xff1a; http://www.graphviz.org/documentation/ https://graphviz.readthedocs.io/en/stable/index.html 文章目录 需求描述环境配置实现思路代码实现 需求描述 根据各模块之间的传参关系绘制出数据流&#xff0c;如下图所示&#xff1a; 并且生成…

【SpringBoot】SpringBoot 项目初始化方法

github 搜索 springboot 模板 github 搜索 springboot 模板&#xff0c;拉取现成代码。 SpringBoot 官方的模板生成器 SpringBoot 官方的模板生成器&#xff08;https://start.spring.io/&#xff09; 在 IDEA 开发工具中生成 这里我修改成阿里的镜像主要是要使用 Java8。 …

Elasticsearch 数组值的存储详细介绍

在Elasticsearch中&#xff0c;数组是一种可以存储多个值的字段类型&#xff0c;这些值可以是字符串、数字、对象或者其他数据类型。数组在Elasticsearch中的存储和查询是相对直接和简单的。以下是关于数组值存储的一些要点&#xff1a; 1. 数组字段映射 在Elasticsearch中&am…

YOLOv8 更换主干网络之 HGNetV2

论文地址:https://arxiv.org/abs/2304.08069 代码地址:https://github.com/PaddlePaddle/PaddleDetection 中文翻译:https://blog.csdn.net/weixin_43694096/article/details/131353118 YOLOv8 更换方式 YOLOv8 想用这个主干直接换就行了,因为项目里面已经集成了,写一个…

[python]使用pyqt5搭建yolov8钢筋计数一次性钢材计数系统

【官方框架地址】 github地址&#xff1a;https://github.com/ultralytics/ultralytics 【算法介绍】 Yolov8是一种先进的深度学习模型&#xff0c;用于目标检测和识别。在钢筋计数任务中&#xff0c;Yolov8可以有效地识别和计数图像中的钢筋。下面是对如何使用Yolov8实现钢筋…

【嵌入式移植】4、U-Boot源码分析1—Makefile

U-Boot源码分析1—Makefile 1 分析思路2 u-boot源码目录结构3 Makefile源码3.1 版本号3.2 环境变量3.3 Beautify output3.4 输出文件的目录设置、PHONY目标3.6 目录信息3.5 Source Code Checker3.7 设置单独编译模块、PHONY目标3.8 获取宿主机的架构和系统3.9 设置交叉编译工具…

vue3数据劫持proxy

一、vue2响应式设计 vue2利用Object.defineProperty来劫持data数据的getter和setter操作&#xff0c;遇到数组和对象必须循环遍历所有的域值才能劫持每一个属性 。 Object.keys(data).forEach((prop) > {const dep new Dep();Object.defineProperty(data, prop, {get () {…

urllib模块使用

urllib.request.urlopen(url, dataNone, [timeout, ]*, cafileNone, capathNone, cadefaultFalse, contextNone) import urllib.requesturl http://httpbin.org/ip response urllib.request.urlopen(url) html response.read() # 返回bytes类型数据 print(html)url http:…

一个非常流行的R语言调色板:RColorBrewer

R 语言有许多非常优秀的调色板&#xff0c;本文就介绍一个非常流行的&#xff0c;我也经常在用的调色板 R 包&#xff1a;RColorBrewer。 安装 install.packages("RColorBrewer") 加载 library(RColorBrewer) library(knitr) 初探 ?RColorBrewer 在帮助页面可以看到…

Oracle数据库协议适配器错误解决方法

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

Python实现单因素方差分析

Python实现单因素方差分析 1.背景 正念越来越受到人们关注&#xff0c;正念是一种有意的、不加评判的对当下的注意觉察。可以通过可以通过观呼吸、身体扫描、正念饮食等多种方式培养。 为了验证正念对记忆力的影响&#xff0c;选取三组被试分别进行正念训练&#xff0c;运动训…