Spring Boot全局异常处理:“危机公关”团队
目录
- 一、全局异常处理的作用
- 二、Spring Boot 实现全局异常处理(附上代码实例)
- 三、总结:
🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解SpringBoot的Bean请看: 从乐高积木到乐队指挥,用最通俗易懂的方式带你玩转 Spring Boot Bean!
✨更多请看个人主页: 码熔burning
咱今儿个就来好好讲解一下SpringBoot的全局异常处理,保证你听得懂,会写,会用😁!
一、全局异常处理的作用
想象一下,你开了一家餐厅 🍽️。
-
没有全局异常处理: 如果你的厨师 👨🍳 在做菜的时候,不小心把盐放多了 🧂,或者烤箱 🔥 突然坏了,导致菜做砸了 😫。顾客吃到难吃的菜,会直接抱怨 🗣️,甚至直接走人 🚶♀️,餐厅的声誉就受损了 📉。而且,你可能不知道具体是哪个环节出了问题 🤔,下次还可能犯同样的错误 🤦。
-
有全局异常处理: 你安排了一个“危机公关”团队 🦸♀️🦸♂️,专门处理这些突发情况。
- 如果厨师做菜出错,危机公关团队会立刻介入 🏃♀️,给顾客道歉 🙏,提供补偿(比如打折 💰、换菜 🔄),尽量安抚顾客的情绪 😊。
- 同时,危机公关团队会记录下出错的原因 📝(盐放多了、烤箱坏了),反馈给厨师和设备维护人员 🛠️,避免下次再犯 🚫。
- 即使顾客非常生气 😡,危机公关团队也能保持冷静 🧘♀️,用专业的态度处理问题 🤝,尽量维护餐厅的形象 💯。
总结: 全局异常处理就像餐厅的“危机公关”团队,它的作用是:
- 兜底: 当程序出现未预料的错误(异常)时,防止程序崩溃 💥,给用户一个友好的提示 💬,而不是让用户看到一堆乱七八糟的错误代码 😵💫。
- 统一处理: 将所有异常集中到一个地方处理 📍,方便记录日志 🪵、发送报警 🚨、返回统一的错误格式 🏷️,避免代码重复 ♻️。
- 提升用户体验: 给用户更友好的错误提示 😃,而不是让用户看到技术性的错误信息 🤓。
- 方便维护: 方便开发人员定位问题 🔍,改进代码 💻,提高程序的健壮性 💪。
二、Spring Boot 实现全局异常处理(附上代码实例)
Spring Boot 提供了几种实现全局异常处理的方式,最常用的是使用 @ControllerAdvice
和 @ExceptionHandler
注解。
1. @ControllerAdvice
(异常处理中心)
@ControllerAdvice
就像一个“异常处理中心” 🏥,它会拦截所有 Controller 中抛出的异常 🛑。- 你可以把它理解为一个特殊的 Controller 🕹️,专门用来处理异常。
2. @ExceptionHandler
(异常处理方法)
@ExceptionHandler
就像“异常处理中心”里的“专家” 👨⚕️👩⚕️,每个专家负责处理一种类型的异常 🩺。- 你可以用它来指定某个方法专门处理哪种类型的异常 🎯。
代码示例:
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 {// 处理自定义的业务异常@ExceptionHandler(value = BusinessException.class)@ResponseBody // 返回 JSON 格式的数据 📦public ResponseEntity<Map<String, Object>> handleBusinessException(BusinessException e) {Map<String, Object> errorInfo = new HashMap<>();errorInfo.put("code", e.getCode());errorInfo.put("message", e.getMessage());return new ResponseEntity<>(errorInfo, HttpStatus.BAD_REQUEST); // 返回 400 状态码 ❌}// 处理空指针异常@ExceptionHandler(value = NullPointerException.class)@ResponseBodypublic ResponseEntity<Map<String, Object>> handleNullPointerException(NullPointerException e) {Map<String, Object> errorInfo = new HashMap<>();errorInfo.put("code", "500");errorInfo.put("message", "服务器内部错误:空指针异常 💥");errorInfo.put("detail", e.getMessage()); // 可以记录更详细的错误信息 ℹ️return new ResponseEntity<>(errorInfo, HttpStatus.INTERNAL_SERVER_ERROR); // 返回 500 状态码 🤕}// 处理其他所有未知的异常 (兜底)@ExceptionHandler(value = Exception.class)@ResponseBodypublic ResponseEntity<Map<String, Object>> handleException(Exception e) {Map<String, Object> errorInfo = new HashMap<>();errorInfo.put("code", "999");errorInfo.put("message", "服务器发生未知错误 🤷♀️");errorInfo.put("detail", e.getMessage());return new ResponseEntity<>(errorInfo, HttpStatus.INTERNAL_SERVER_ERROR);}
}// 自定义业务异常类
class BusinessException extends RuntimeException {private String code;private String message;public BusinessException(String code, String message) {this.code = code;this.message = message;}public String getCode() {return code;}public String getMessage() {return message;}
}
代码解释:
@ControllerAdvice
: 告诉 Spring,这是一个全局异常处理类 📣。@ExceptionHandler(value = BusinessException.class)
: 告诉 Spring,handleBusinessException
方法专门处理BusinessException
类型的异常 🎯。value
属性指定了要处理的异常类型。@ResponseBody
: 告诉 Spring,将方法的返回值转换为 JSON 格式 📦,返回给客户端。ResponseEntity<Map<String, Object>>
: 方法的返回值类型,表示返回一个包含错误信息的 JSON 对象 🧾,以及 HTTP 状态码。handleBusinessException(BusinessException e)
: 异常处理方法,接收一个BusinessException
类型的参数e
,表示捕获到的异常对象 🎣。 你可以在这里获取异常的信息,并进行处理 ⚙️。Map<String, Object> errorInfo
: 创建一个 Map 对象 🗺️,用于存储错误信息,例如错误码、错误消息等。new ResponseEntity<>(errorInfo, HttpStatus.BAD_REQUEST)
: 创建一个ResponseEntity
对象 🎁,包含错误信息和 HTTP 状态码。HttpStatus.BAD_REQUEST
表示 400 错误 ❌,表示客户端请求有误。handleException(Exception e)
: 处理所有未知的异常 🤷♀️,这是一个兜底方案 🛡️,防止程序崩溃 💥。
如何使用:
-
创建自定义异常类 (可选): 例如上面的
BusinessException
,你可以根据业务需求创建自己的异常类 ✏️。 -
在 Controller 中抛出异常:
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController;@RestController public class MyController {@GetMapping("/test")public String test(String input) {if (input == null || input.isEmpty()) {throw new BusinessException("1001", "输入不能为空 🚫"); // 抛出自定义异常}if (input.equals("error")) {throw new NullPointerException("模拟空指针异常 💥"); // 抛出空指针异常}return "Hello, " + input;} }
-
启动 Spring Boot 应用: 当 Controller 中抛出异常时,
GlobalExceptionHandler
会捕获这些异常 🎣,并进行处理 ⚙️,返回统一的错误信息给客户端 💬。
测试:
- 访问
http://localhost:8080/test?input=
(不带参数),会返回一个 400 错误 ❌,包含错误码 “1001” 和错误消息 “输入不能为空 🚫”。 - 访问
http://localhost:8080/test?input=error
,会返回一个 500 错误 🤕,包含错误码 “500” 和错误消息 “服务器内部错误:空指针异常 💥”。 - 访问
http://localhost:8080/test?input=world
,会正常返回 “Hello, world” 😊。
三、总结:
- 使用
@ControllerAdvice
创建一个全局异常处理类 🏥。 - 使用
@ExceptionHandler
注解指定处理特定类型的异常的方法 🎯。 - 在异常处理方法中,获取异常信息 ℹ️,并返回统一的错误格式 🏷️ 给客户端。
- 可以自定义异常类 ✏️,方便处理业务逻辑中的错误。
更进一步:
- 日志记录: 在异常处理方法中,可以使用日志框架(例如 Logback、Log4j)记录异常信息 🪵,方便排查问题 🔍。
- 发送报警: 当发生严重错误时,可以发送邮件 📧、短信 📱 等报警信息给开发人员 👨💻👩💻。
- 统一错误码: 定义一套统一的错误码规范 🔢,方便客户端识别和处理错误。
- AOP 方式: 除了
@ControllerAdvice
,还可以使用 AOP (面向切面编程) 来实现全局异常处理,更加灵活 🤸。
希望这篇文章的讲解能够帮助你理解 Spring Boot 的全局异常处理 。 记住,全局异常处理是提高程序健壮性和用户体验的重要手段 。 多练习 🏋️♀️,多实践 ,你就能掌握它! 🎉
相关文章:

Spring Boot全局异常处理:“危机公关”团队
目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理(附上代码实例)三、总结: 🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢…...

Wireshark:自定义类型帧解析
文章目录 1. 前言2. 背景3. 开发 Lua 插件 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 背景 Wireshark 不认识用 tcpdump 抓取的数据帧,仔细分析相关代码和数据帧后,…...

Redis7——进阶篇(一)
前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二)Redis(三)Redis&#x…...

word转换为pdf后图片失真解决办法、高质量PDF转换方法
1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker (1)点击word选项卡上的Acrobat插件,(2)点击“首选项”按钮,(3)点击“高级配置”按钮(4)点…...
Kafka零拷贝
Kafka为什么适用零拷贝,其他存储结构不适用? Kafka 采用的是日志存储模型,数据通常是顺序写入、顺序读取,并且它的消费模式是 “读完即走”(一次性读取并发送给消费者),这与零拷贝的特性完美匹…...
鸿蒙应用开发入门教程
鸿蒙应用开发入门教程 基础准备与环境搭建 1. 了解鸿蒙系统 1.1 核心理念学习 HarmonyOS(鸿蒙系统)是华为推出的全场景分布式操作系统,其核心特点如下: 分布式能力 设备协同:手机、平板、智能手表、IoT设备等可无…...

【2022——暴力DP / 优雅背包】
题目 代码 #include <bits/stdc.h> using namespace std; using ll long long;const int N 2023;ll f[2][2023][2023];int main() {f[0][0][0] 1;for(int i 1; i < 10; i) //次数{for(int j 0; j< 2022; j)for(int k 0; k < 2022; k)f[i&1][j][k] 0…...

AI智能体与大语言模型:重塑SaaS系统的未来航向
在数字化转型的浪潮中,软件即服务(SaaS)系统一直是企业提升效率、优化业务流程的重要工具。随着AI智能体和大语言模型(LLMs)的迅速发展,SaaS系统正迎来前所未有的变革契机。本文将从AI智能体和大语言模型对…...

绕过密码卸载360终端安全管理系统
一不小心在电脑上安装了360终端安全管理系统,就会发现没有密码,就无法退出无法卸载360,很容易成为一个心病,360终端安全管理系统,没有密码,进程无法退出,软件无法卸载,前不久听同事说…...

golang安装(1.23.6)
1.切换到安装目录 cd /usr/local 2.下载安装包 wget https://go.dev/dl/go1.23.6.linux-amd64.tar.gz 3.解压安装包 sudo tar -C /usr/local -xzf go1.23.6.linux-amd64.tar.gz 4.配置环境变量 vi /etc/profile export PATH$…...

星闪开发入门之常见报错整理(一)
系列文章目录 星闪开发入门之常见报错整理(一) 文章目录 系列文章目录前言一、ComX open fail, please check com is busy or not exist二、CMake下载失败三、配置文件出现语法错误四、路径过长导致编译报错五、ninja: build stopped: subcommand fai…...
Node.js与MySQL的深入探讨
Node.js与MySQL的深入探讨 引言 Node.js,一个基于Chrome V8引擎的JavaScript运行时环境,以其非阻塞、事件驱动的方式在服务器端应用中占据了一席之地。MySQL,作为一款广泛使用的开源关系型数据库管理系统,凭借其稳定性和高效性,成为了许多应用的数据库选择。本文将深入探…...
【JAVA】阿里云百炼平台对接DeepSeek-V3大模型使用详解
1、DeepSeek简介 DeepSeek的火热让全世界见证了一场国产AI大模型走向巅峰的盛宴。DeepSeek的横空出世一方面让AI大模型的格局得到重塑,另一方面,对于普通人来说,也有机会零距离的体验到更懂国人的AI大模型。从很多使用过后的小伙伴们的反馈来…...
springboot项目部署脚本
Springboot部署脚本 该脚本可用于jenkins自动执行,具有以下功能 适配所有以内嵌tomcat容器springboot项目jar包可根据参数选择环境,基于profiles可自动识别并关闭已存在进程第一个参数是指定jar包所在绝对路径(该路径下必须有且仅有一个.jar文件) 第二…...

黑马Java面试教程_P5_微服务
系列博客目录 文章目录 系列博客目录1.引言2.Spring Cloud2.1 Spring Cloud 5大组件有哪些?面试文稿 2.2 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?面试文稿 2.3 我看你之前也用过nacos、你能说下nacos与eureka的区别?面试文稿 2.4 你们项目负载均衡如…...
使用Fuse-DFS挂载文件存储 HDFS-后端存储ceph
1. 编译环境准备 yum install cmake3 ln -s /usr/bin/cmake3 /usr/bin/cmake yum install gcc-c安装挂载依赖 yum -y install fuse fuse-devel fuse-libs执行以下命令,载入FUSE模块 modprobe fuse2. 下载源码包 hadoop-3.3.4-src.tar.gz解压后执行以下命令 打开…...

生成式AI项目的生命周期
总结自视频(吴恩达大模型入门课):9_13_generative-ai-project-lifecycle_哔哩哔哩_bilibili 生成周期如下图,包含四部分:任务范围(Scope),选择大模型(Select)…...

SOC-ATF 安全启动BL1流程分析(1)
一、ATF 源码下载链接 1. ARM Trusted Firmware (ATF) 官方 GitHub 仓库 GitHub 地址: https://github.com/ARM-software/arm-trusted-firmware 这是 ATF 的官方源码仓库,包含最新的代码、文档和示例。 下载方式: 使用 Git 克隆仓库: git…...

游戏引擎学习第127天
仓库:https://gitee.com/mrxiao_com/2d_game_3 为本周设定阶段 我们目前的渲染器已经实现了令人惊讶的优化,经过过去两周的优化工作后,渲染器在1920x1080分辨率下稳定地运行在60帧每秒。这个结果是意料之外的,因为我们没有预计会达到这样的…...

Grafana使用日志7--开启Sigv4
背景 在Grafana中,有些data source是需要开启sigv4认证的,例如OpenSearch,这个配置项默认是关闭的,这里我们介绍一下怎么开启 步骤 传统方式 如果我们想在Grafana中开启sigv4认证,我们需要在grafana.ini中修改一个…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

6.9-QT模拟计算器
源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...

海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...

C++--string的模拟实现
一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现,其目的是加强对string的底层了解,以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量,…...
Netty自定义协议解析
目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...
使用python进行图像处理—图像滤波(5)
图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值,以达到平滑(去噪)、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算,…...