在Java项目中,引入【全局异常处理器】

目录

一.为什么引入全局异常处理器(目前项目碰到了什么问题)?

1.问题描述

2.与预期的差别

3.解决方案

二.解决上述问题

1.定义【业务异常类】

2.在serviceImpl层,手动抛出【违反唯一性约束】这个异常

3.定义【全局异常处理器】

4.修改userController层的代码

三.展示效果

四.重点理解【全局异常处理器】的优点

1.项目引入了全局异常处理器以后,就不用在controller里面判断insert语句的影响行数了

2.引入全局异常处理器后,可以使得请求异常时的响应数据可读性非常强。

3.引入全局异常处理器后,后端产生异常时不会在控制台输出大片异常信息。

4.总结大致流程

结语


一.为什么引入全局异常处理器(目前项目碰到了什么问题)?

1.问题描述

        我们在添加一个系统用户时,要求用户名(username字段)必须是唯一的,即不能重复。如果重复了,那么insert语句不会返回0(之前我们是这么认为的),而是直接令后端报错。如下:

使用apiFox添加一个系统用户: 

去后端控制台查看报错:

可见此时是因为违反了user表的username字段的唯一约束(unique)。

2.与预期的差别

        我的初衷是:添加一个系统用户时,如果添加成功,就返回影响行数1;如果添加失败,就返回影响行数0。 

        这样就能在controller层中,根据影响行数来决定返回给前端什么响应体。

        如下:

        userServiceImpl层:

        userController层: 

        重点来了:上述所预想的一切,都不成立。因为当insert语句执行失败时,根本就不返回影响行数0,而是直接使后端崩塌,响应给前端的数据也是可读性极差。 

3.解决方案

         此时就需要定义【业务异常】和【全局异常处理器】来包容上述的错误。

        就好比insert语句执行失败时,扔出一颗炸弹,但没关系,我们直接使用全局异常处理器,来吸收即可。

二.解决上述问题

1.定义【业务异常类】

        该业务异常类,就包括我们上面提到的违反了唯一约束的这种异常。

        而且以后我们项目中出现了其他的业务异常,也可以用该类来接收。

        第一步:创建Exception目录,用来存放自定义异常类和全局异常处理器。

        第二步:在 Exception目录下,创建【业务异常类】。

2.在serviceImpl层,手动抛出【违反唯一性约束】这个异常

3.定义【全局异常处理器】

全局异常处理器,得益于spring。我们可以在全局异常处理器中,进行捕获某种异常并进行对应操作。从而来优化响应数据、防止后端崩塌(其实是美化后端控制台)。

在exception目录下,创建全局异常处理器。

package com.neuedu.his.Exception;import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;@ControllerAdvice//该注解可以自动捕获我们刚才抛出的异常
public class GlobalExceptionHandler {//处理自定义异常:【业务异常BusinessException】@ExceptionHandler(BusinessException.class)//专门处理业务异常类BusinessException@ResponseBody//表示我们要将该方法的返回值转为JSON格式返回给前端public ResponseEntity<Map<String, Object>> handleBusinessException(BusinessException e){Map<String, Object> response = new HashMap<>();response.put("code", 409);response.put("message", e.getMessage());return new ResponseEntity<>(response, HttpStatus.CONFLICT);}//处理其他异常@ExceptionHandler(Exception.class)@ResponseBodypublic ResponseEntity<Map<String, Object>> handleException(Exception e){Map<String, Object> response = new HashMap<>();response.put("code", 500);response.put("message", "系统内部错误,请稍后重试");return new ResponseEntity<>(response, HttpStatus.INTERNAL_SERVER_ERROR);}
}

4.修改userController层的代码

三.展示效果

成功的情况:

异常情况1:违反了数据库字段唯一性(业务异常)

异常情况2:其他异常

四.重点理解【全局异常处理器】的优点

1.项目引入了全局异常处理器以后,就不用在controller里面判断insert语句的影响行数了

        如下:我们在userController层中,没有判断insert语句的影响行数的情况下,就返回了成功信息。

        这是因为,代码能走到这里,说明userService没有抛出任何异常,也就间接说明了我们的添加用户业务没有任何问题,因此结果肯定是添加成功,因此就可以直接返回成功信息。

        因此以后我们项目引入全局异常处理器以后,在controller层可以直接调用完service层后直接返回成功信息。

2.引入全局异常处理器后,可以使得请求异常时的响应数据可读性非常强。

引入全局异常处理器之前,请求异常时的响应信息:

引入全局异常处理器之后,请求异常时的响应信息:

如下图:这两种异常请求下的响应数据,可读性都十分强,比原来的大坨字母强多了。

3.引入全局异常处理器后,后端产生异常时不会在控制台输出大片异常信息。

引入全局异常处理器之前,产生异常时控制台的样貌:

引入全局异常处理器之后,产生异常时控制台的样貌:

4.总结大致流程

①定义【自定义异常类】和【全局异常处理器】

②手动在serviceIml层抛出异常

③【全局异常处理器】自动捕获上面抛出的异常,并进行响应消息处理。

④如果serviceImpl层没抛出异常,则响应消息由controller层返回;

    如果serviceImpl层抛出了一场,则响应消息由【全局异常处理器】的某个方法返回。

结语

以上就是在项目中,引入【全局异常处理器】的原因、做法、优点。

喜欢本篇文章的话,可以留个免费的关注呦~~

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

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

相关文章

newspaper公共库获取每个 URL 对应的新闻内容,并将提取的新闻正文保存到一个文件中

示例代码&#xff1a; from newspaper import Article from newspaper import Config import json from tqdm import tqdm import os import requestswith open(datasource/api/news_api.json, r) as file:data json.load(file)print(len(data)) save_path datasource/sourc…

前端核心知识:Vue 3 编程的 10 个实用技巧

文章目录 1. **使用 ref 和 reactive 管理响应式数据**原理解析代码示例注意事项 2. **组合式 API&#xff08;Composition API&#xff09;**原理解析代码示例优势 3. **使用 watch 和 watchEffect 监听数据变化**原理解析代码示例注意事项 4. **使用 provide 和 inject 实现跨…

【Web API系列】XMLHttpRequest API和Fetch API深入理解与应用指南

前言 在现代Web开发中&#xff0c;客户端与服务器之间的异步通信是构建动态应用的核心能力。无论是传统的AJAX技术&#xff08;基于XMLHttpRequest&#xff09;还是现代的Fetch API&#xff0c;它们都为实现这一目标提供了关键支持。本文将从底层原理、核心功能、代码实践到实…

[特殊字符] Spring Boot 日志系统入门博客大纲(适合初学者)

一、前言 &#x1f4cc; 为什么日志在项目中如此重要&#xff1f; 在开发和维护一个后端系统时&#xff0c;日志就像程序运行时的“黑匣子”&#xff0c;帮我们记录系统的各种行为和异常。一份良好的日志&#xff0c;不仅能帮助我们快速定位问题&#xff0c;还能在以下场景中…

IP协议之IP,ICMP协议

1.因特网中的主要协议是TCP/IP&#xff0c;Interneet协议也叫TCP/IP协议簇 2.ip地址用点分十进制表示&#xff0c;由32位的二进制表示&#xff0c;两部分组成&#xff1a;网络标识主机标识 3.IP地址分类; A:0.0.0.0-127.255.255.255 B&#xff1a;128.0.0.0-191.255.255.25…

GPIO_ReadInputData和GPIO_ReadInputDataBit区别

目录 1、GPIO_ReadInputData: 2、GPIO_ReadInputDataBit: 总结 GPIO_ReadInputData 和 GPIO_ReadInputDataBit 是两个函数&#xff0c;通常用于读取微控制器GPIO&#xff08;通用输入输出&#xff09;引脚的输入状态&#xff0c;特别是在STM32系列微控制器中。它们之间的主要…

洛古B4158 [BCSP-X 2024 12 月小学高年级组] 质数补全(线性筛/dfs)

B4158 [BCSP-X 2024 12 月小学高年级组] 质数补全 - 洛谷 思路1:线性筛,字符串匹配,枚举 质数筛选 要解决这个问题&#xff0c;首先得找出指定范围内&#xff08;这里是 1 到 10000000&#xff09;的所有质数。常用的质数筛选算法有埃拉托斯特尼筛法&#xff08;埃氏筛&#…

一周学会Pandas2 Python数据处理与分析-Pandas2读取Excel

锋哥原创的Pandas2 Python数据处理与分析 视频教程&#xff1a; 2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili Excel格式文件是办公使用和处理最多的文件格式之一&#xff0c;相比CSV文件&#xff0c;Excel是有样式的。Pandas2提…

NVIDIA H100 vs A100:新一代GPU架构性能对比分析

一、核心架构演进对比 ‌Ampere架构&#xff08;A100&#xff09;‌采用台积电7nm工艺&#xff0c;集成540亿晶体管&#xff0c;配备6,912个CUDA核心和432个第三代Tensor Core&#xff0c;支持FP16、TF32和INT8精度计算。其显存子系统采用HBM2e技术&#xff0c;80GB版本带宽可…

保护PCBA的不同方法:喷三防漆 vs 镀膜

PCBA&#xff08;印刷电路板组件&#xff09;的防护工艺中&#xff0c;喷三防漆和镀膜&#xff08;如Parylene气相沉积&#xff09;是两种常见技 术。它们在防护目的上类似&#xff0c;但在具体实现方式和应用场景上有显著差异。以下从外观、工艺、性 能、物理性质和成本五个…

VitePress 项目部署 cloudflare page 提示 npm run build 错误

构建的错误信息如下&#xff1a; 09:52:57.975 ➤ YN0000: Done with warnings in 3s 120ms 09:52:58.072 Executing user command: npm run build 09:52:58.817 npm ERR! Missing script: "build" 09:52:58.818 npm ERR! 09:52:58.818 npm ERR! To see a list of …

C++学习之ORACLE③

1.集合运算符 查询部门号是10和20的员工信息&#xff1a; &#xff1f;思考有几种方式解决该问题 &#xff1f; SQL> select * from emp where deptno in(10, 20) SQL> select * from emp where deptno10 or deptno20 集合运算&#xff1a; Select * from emp …

人工智能之数学基础:复矩阵

本文重点 复矩阵是线性代数中以复数为元素的矩阵,是实矩阵在复数域上的自然推广。与实矩阵相比,复矩阵在数学性质、运算规则和应用场景上具有独特性,尤其在量子力学、信号处理、控制理论等领域发挥关键作用。 复矩阵的定义与表示 定义:复矩阵指的是元素含有复数的矩阵。…

华清远见成都中心嵌入式学习总结

一、Linux 基础入门 课程首先介绍了 Linux 系统的六大特性&#xff0c;包括开源、免费、可裁剪等核心优势。重点讲解了文件系统结构&#xff0c;强调根目录&#xff08;/&#xff09;作为唯一入口的树状结构。通过实操学习了 pwd、ls、cd 等基础命令&#xff0c;掌握了绝对路径…

linux安装ollama

俩种方式都可 一、linux通过docker安装ollama镜像 1.下载安装ollama镜像 # 安装 Docker sudo yum install docker sudo systemctl start docker#docker查看所有容器 docker ps -a # 查看所有容器# docker查看指定容器 docker ps -a |grep ollama# 创建模型存储目录&#xff…

Redis 学习目标

&#x1f3af; Redis 学习目标&#xff08;开发者视角&#xff09; ✅ 一、学习完成后能掌握的核心能力&#xff1a; 分类具体内容&#x1f4e6; 基础能力熟练掌握 Redis 五大数据结构&#xff08;String、List、Hash、Set、ZSet&#xff09;&#xff0c;会用也会选对场景&am…

gerrit配置及使用git-lfs

gerrit服务器端配置 下载git-lfs插件 登录Dashboard [Jenkins] (gerritforge.com)&#xff0c;下载对应版本的插件 配置gerrit 将下载的lfs.jar插件放到${GERRIT_SITE}/plugins/下面为所有仓库启用git-lfs 此步骤需要修改 All-projects 仓库配置&#xff0c;步骤如下 1、克隆仓…

深入理解 Linux PATH 环境变量:配置与优化!!!

深入理解 Linux PATH 环境变量&#xff1a;配置与优化 &#x1f680; 欢迎来到 Linux 环境变量的奇妙世界&#xff01;今天我们来聊聊那个让命令行如鱼得水的幕后英雄——PATH 环境变量&#xff01;&#x1f60e; 通过这篇博客&#xff0c;你将学会如何配置它、优化它&#xff…

如何在AMD MI300X 服务器上部署 DeepSeek R1模型?

DeepSeek-R1凭借其深度推理能力备受关注&#xff0c;在语言模型性能基准测试中可与顶级闭源模型匹敌。 AMD Instinct MI300X GPU可在单节点上高效运行新发布的DeepSeek-R1和V3模型。 用户通过SGLang优化&#xff0c;将MI300X的性能提升至初始版本的4倍&#xff0c;且更多优化将…

简化DB操作:Golang 通用仓库模式

介绍 本代码包提供一个用于数据库操作的通用仓库 (GenericRepository)&#xff0c;利用 Golang 和 GORM (Go ORM) 实现。该仓库设计用于简化数据库的 CRUD (创建、读取、更新、删除) 操作&#xff0c;支持批处理、冲突处理、分页查询等高级功能。 主要功能 创建记录 (Create…