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

Spring Boot全局异常处理:“危机公关”团队

在这里插入图片描述

目录

    • 一、全局异常处理的作用
    • 二、Spring Boot 实现全局异常处理(附上代码实例)
    • 三、总结:

🌟我的其他文章也讲解的比较有趣😁,如果喜欢博主的讲解方式,可以多多支持一下,感谢🤗!
🌟了解SpringBoot的Bean请看: 从乐高积木到乐队指挥,用最通俗易懂的方式带你玩转 Spring Boot Bean!
✨更多请看个人主页: 码熔burning

咱今儿个就来好好讲解一下SpringBoot的全局异常处理,保证你听得懂,会写,会用😁!

一、全局异常处理的作用

想象一下,你开了一家餐厅 🍽️。

  • 没有全局异常处理: 如果你的厨师 👨‍🍳 在做菜的时候,不小心把盐放多了 🧂,或者烤箱 🔥 突然坏了,导致菜做砸了 😫。顾客吃到难吃的菜,会直接抱怨 🗣️,甚至直接走人 🚶‍♀️,餐厅的声誉就受损了 📉。而且,你可能不知道具体是哪个环节出了问题 🤔,下次还可能犯同样的错误 🤦。

  • 有全局异常处理: 你安排了一个“危机公关”团队 🦸‍♀️🦸‍♂️,专门处理这些突发情况。

    • 如果厨师做菜出错,危机公关团队会立刻介入 🏃‍♀️,给顾客道歉 🙏,提供补偿(比如打折 💰、换菜 🔄),尽量安抚顾客的情绪 😊。
    • 同时,危机公关团队会记录下出错的原因 📝(盐放多了、烤箱坏了),反馈给厨师和设备维护人员 🛠️,避免下次再犯 🚫。
    • 即使顾客非常生气 😡,危机公关团队也能保持冷静 🧘‍♀️,用专业的态度处理问题 🤝,尽量维护餐厅的形象 💯。

总结: 全局异常处理就像餐厅的“危机公关”团队,它的作用是:

  1. 兜底: 当程序出现未预料的错误(异常)时,防止程序崩溃 💥,给用户一个友好的提示 💬,而不是让用户看到一堆乱七八糟的错误代码 😵‍💫。
  2. 统一处理: 将所有异常集中到一个地方处理 📍,方便记录日志 🪵、发送报警 🚨、返回统一的错误格式 🏷️,避免代码重复 ♻️。
  3. 提升用户体验: 给用户更友好的错误提示 😃,而不是让用户看到技术性的错误信息 🤓。
  4. 方便维护: 方便开发人员定位问题 🔍,改进代码 💻,提高程序的健壮性 💪。

二、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;}
}

代码解释:

  1. @ControllerAdvice: 告诉 Spring,这是一个全局异常处理类 📣。
  2. @ExceptionHandler(value = BusinessException.class): 告诉 Spring,handleBusinessException 方法专门处理 BusinessException 类型的异常 🎯。 value 属性指定了要处理的异常类型。
  3. @ResponseBody: 告诉 Spring,将方法的返回值转换为 JSON 格式 📦,返回给客户端。
  4. ResponseEntity<Map<String, Object>>: 方法的返回值类型,表示返回一个包含错误信息的 JSON 对象 🧾,以及 HTTP 状态码。
  5. handleBusinessException(BusinessException e): 异常处理方法,接收一个 BusinessException 类型的参数 e,表示捕获到的异常对象 🎣。 你可以在这里获取异常的信息,并进行处理 ⚙️。
  6. Map<String, Object> errorInfo: 创建一个 Map 对象 🗺️,用于存储错误信息,例如错误码、错误消息等。
  7. new ResponseEntity<>(errorInfo, HttpStatus.BAD_REQUEST): 创建一个 ResponseEntity 对象 🎁,包含错误信息和 HTTP 状态码。 HttpStatus.BAD_REQUEST 表示 400 错误 ❌,表示客户端请求有误。
  8. handleException(Exception e): 处理所有未知的异常 🤷‍♀️,这是一个兜底方案 🛡️,防止程序崩溃 💥。

如何使用:

  1. 创建自定义异常类 (可选): 例如上面的 BusinessException,你可以根据业务需求创建自己的异常类 ✏️。

  2. 在 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;}
    }
    
  3. 启动 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” 😊。

三、总结:

  1. 使用 @ControllerAdvice 创建一个全局异常处理类 🏥。
  2. 使用 @ExceptionHandler 注解指定处理特定类型的异常的方法 🎯。
  3. 在异常处理方法中,获取异常信息 ℹ️,并返回统一的错误格式 🏷️ 给客户端。
  4. 可以自定义异常类 ✏️,方便处理业务逻辑中的错误。

更进一步:

  • 日志记录: 在异常处理方法中,可以使用日志框架(例如 Logback、Log4j)记录异常信息 🪵,方便排查问题 🔍。
  • 发送报警: 当发生严重错误时,可以发送邮件 📧、短信 📱 等报警信息给开发人员 👨‍💻👩‍💻。
  • 统一错误码: 定义一套统一的错误码规范 🔢,方便客户端识别和处理错误。
  • AOP 方式: 除了 @ControllerAdvice,还可以使用 AOP (面向切面编程) 来实现全局异常处理,更加灵活 🤸。

希望这篇文章的讲解能够帮助你理解 Spring Boot 的全局异常处理 。 记住,全局异常处理是提高程序健壮性和用户体验的重要手段 。 多练习 🏋️‍♀️,多实践 ,你就能掌握它! 🎉

相关文章:

Spring Boot全局异常处理:“危机公关”团队

目录 一、全局异常处理的作用二、Spring Boot 实现全局异常处理&#xff08;附上代码实例&#xff09;三、总结&#xff1a; &#x1f31f;我的其他文章也讲解的比较有趣&#x1f601;&#xff0c;如果喜欢博主的讲解方式&#xff0c;可以多多支持一下&#xff0c;感谢&#x1…...

Wireshark:自定义类型帧解析

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

Redis7——进阶篇(一)

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

word转换为pdf后图片失真解决办法、高质量PDF转换方法

1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker &#xff08;1&#xff09;点击word选项卡上的Acrobat插件&#xff0c;&#xff08;2&#xff09;点击“首选项”按钮&#xff0c;&#xff08;3&#xff09;点击“高级配置”按钮&#xff08;4&#xff09;点…...

Kafka零拷贝

Kafka为什么适用零拷贝&#xff0c;其他存储结构不适用&#xff1f; Kafka 采用的是日志存储模型&#xff0c;数据通常是顺序写入、顺序读取&#xff0c;并且它的消费模式是 “读完即走”&#xff08;一次性读取并发送给消费者&#xff09;&#xff0c;这与零拷贝的特性完美匹…...

鸿蒙应用开发入门教程

鸿蒙应用开发入门教程 基础准备与环境搭建 1. 了解鸿蒙系统 1.1 核心理念学习 HarmonyOS&#xff08;鸿蒙系统&#xff09;是华为推出的全场景分布式操作系统&#xff0c;其核心特点如下&#xff1a; 分布式能力 设备协同&#xff1a;手机、平板、智能手表、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系统的未来航向

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

绕过密码卸载360终端安全管理系统

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

golang安装(1.23.6)

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

星闪开发入门之常见报错整理(一)

系列文章目录 星闪开发入门之常见报错整理&#xff08;一&#xff09; 文章目录 系列文章目录前言一、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大模型的格局得到重塑&#xff0c;另一方面&#xff0c;对于普通人来说&#xff0c;也有机会零距离的体验到更懂国人的AI大模型。从很多使用过后的小伙伴们的反馈来…...

springboot项目部署脚本

Springboot部署脚本 该脚本可用于jenkins自动执行&#xff0c;具有以下功能 适配所有以内嵌tomcat容器springboot项目jar包可根据参数选择环境&#xff0c;基于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执行以下命令&#xff0c;载入FUSE模块 modprobe fuse2. 下载源码包 hadoop-3.3.4-src.tar.gz解压后执行以下命令 打开…...

生成式AI项目的生命周期

总结自视频&#xff08;吴恩达大模型入门课&#xff09;&#xff1a;9_13_generative-ai-project-lifecycle_哔哩哔哩_bilibili 生成周期如下图&#xff0c;包含四部分&#xff1a;任务范围&#xff08;Scope&#xff09;&#xff0c;选择大模型&#xff08;Select&#xff09…...

SOC-ATF 安全启动BL1流程分析(1)

一、ATF 源码下载链接 1. ARM Trusted Firmware (ATF) 官方 GitHub 仓库 GitHub 地址: https://github.com/ARM-software/arm-trusted-firmware 这是 ATF 的官方源码仓库&#xff0c;包含最新的代码、文档和示例。 下载方式&#xff1a; 使用 Git 克隆仓库&#xff1a; git…...

游戏引擎学习第127天

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

Grafana使用日志7--开启Sigv4

背景 在Grafana中&#xff0c;有些data source是需要开启sigv4认证的&#xff0c;例如OpenSearch&#xff0c;这个配置项默认是关闭的&#xff0c;这里我们介绍一下怎么开启 步骤 传统方式 如果我们想在Grafana中开启sigv4认证&#xff0c;我们需要在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模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;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入选《中国网络安全细分领域产品名录》

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

C++--string的模拟实现

一,引言 string的模拟实现是只对string对象中给的主要功能经行模拟实现&#xff0c;其目的是加强对string的底层了解&#xff0c;以便于在以后的学习或者工作中更加熟练的使用string。本文中的代码仅供参考并不唯一。 二,默认成员函数 string主要有三个成员变量&#xff0c;…...

Netty自定义协议解析

目录 自定义协议设计 实现消息解码器 实现消息编码器 自定义消息对象 配置ChannelPipeline Netty提供了强大的编解码器抽象基类,这些基类能够帮助开发者快速实现自定义协议的解析。 自定义协议设计 在实现自定义协议解析之前,需要明确协议的具体格式。例如,一个简单的…...

使用python进行图像处理—图像滤波(5)

图像滤波是图像处理中最基本和最重要的操作之一。它的目的是在空间域上修改图像的像素值&#xff0c;以达到平滑&#xff08;去噪&#xff09;、锐化、边缘检测等效果。滤波通常通过卷积操作实现。 5.1卷积(Convolution)原理 卷积是滤波的核心。它是一种数学运算&#xff0c;…...