SpringBoot——全局异常处理
目录
异常
项目总结
新建一个SpringBoot项目
pom.xml
Result(通用的响应结果类)
MyBusinessException自定义异常类
GlobalExceptionHandler全局异常处理类
ExceptionController控制器
SpringbootExceptionApplication启动类
参考文章:
- 1、http://t.csdnimg.cn/wzes2
异常
- SpringBoot项目采用了全局异常的概念——所有方法均将异常抛出,并且专门安排一个类统一拦截并处理这些异常。
- 对异常的处理:
- 1、抛出异常
- 2、使用 try...catch...finally 捕获处理异常
- SpringBoot提供了两个注解用于拦截异常
- 1、@ControllerAdvice:标注该类为全局异常处理类,默认拦截所有被触发的异常
- 2、@ExceptionHandler:标注方法,用于处理特定异常
| java.lang.Throwable(所有异常类的根类) | ||
|---|---|---|
| java.lang.Error (错误信息)
| java.lang.Exception(异常信息) | |
| StackOverFlowError:栈空间溢出错误 | 检查期异常
| java.lang.RuntimeException (运行时异常) |
| OutOfMemoryError:内存溢出错误 | java.io.IOException:I/O异常 | java.lang.NullPointerException:空指针异常 |
| IllegalAccessError:非法的访问权限错误 | java.io.FileNotFoundException:文件找不到异常 | java.lang.IndexOutOfBoundsException 和 java.lang.ArrayIndexOutOfBoundsException:数组越界异常 |
| NoClassDefFoundError:JVM未找到类错误 | java.io.ClassNotFoundException:类找不到异常 | java.lang.IllegalArgumentException:非法参数异常 |
| NoSuchMethodError:JVM未找到方法错误 | java.lang.SecurityException:安全异常 | java.util.ConcurrentModificationException:修改状态异常 |
项目总结
- 统一异常处理通过@ControllerAdvice注解向控制器发送通知,并接收所有Controller层的通知,再结合@ExceptionHandler注解对指定的异常进行捕获处理,最后将结果返回给用户
新建一个SpringBoot项目

项目结构:

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.study</groupId><artifactId>springboot_exception</artifactId><version>0.0.1-SNAPSHOT</version><name>springboot_exception</name><description>Demo project for Spring Boot</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
Result(通用的响应结果类)
Result类的作用:
- 统一的响应格式:提高接口的一致性和可维护性。
- 封装错误信息:当发生异常或错误时,可以使用Result类来封装错误信息,包括错误消息和对应的状态码,便于客户端进行统一的处理和解析。
- 携带业务数据:除了错误信息,Result类也可以携带业务数据,例如查询结果、对象详情等,从而完整地描述接口的执行结果。
package com.study.springboot_exception.event;import lombok.Data;@Data
public class Result<T> {private String message;private int code;private T data;
}
MyBusinessException自定义异常类
package com.study.springboot_exception.exception;import lombok.Data;/*** 自定义异常类: 用于及时处理一些不符合业务逻辑的数据* 注意:* 1.必须继承RuntimeException运行时异常,并重写父类构造方法*/
@Data
public class MyBusinessException extends RuntimeException{private static final long serialVersionUID=1L;private int code;private String message;public MyBusinessException(String message){super(message);this.message=message;}public MyBusinessException(int code,String message){super(message);this.code=code;this.message=message;}}
GlobalExceptionHandler全局异常处理类
- 比较常见的错误状态:
- 200:正常响应
- 400:错误的请求
- 404:资源不存在
- 500:代码无法继续执行
- SpringBoot项目是Restful风格,大多使用@RestControllerAdvice注解
package com.study.springboot_exception.exception;import com.study.springboot_exception.event.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;import java.util.StringJoiner;/*** 全局异常处理类*/
@Slf4j
@RestControllerAdvice//标记该类为全局异常处理类
public class GlobalExceptionHandler {/*** 处理自定义异常*/@ExceptionHandler(MyBusinessException.class)//处理特定异常public Result handleBizException(MyBusinessException ex){Result<Object> result=new Result<>();result.setCode(ex.getCode());result.setMessage(ex.getMessage());return result;}/*** 参数校验不通过异常*/@ExceptionHandler(MethodArgumentNotValidException.class)public Result handleMethodArgumentNotValidException(MethodArgumentNotValidException ex){StringJoiner sj=new StringJoiner(";");ex.getBindingResult().getFieldErrors().forEach(x -> sj.add(x.getDefaultMessage()));Result<Object> result=new Result<>();result.setCode(505);result.setMessage(sj.toString());return result;}/*** Controller参数绑定错误*/@ExceptionHandler(MissingServletRequestParameterException.class)public Result handleMissingServletRequestParameterException(MissingServletRequestParameterException ex){Result<Object> result=new Result<>();result.setCode(506);result.setMessage(ex.getMessage());return result;}/*** 其他未知异常(拦截的是全局最底层异常,兜底)*/@ExceptionHandler(value=Exception.class)public Result handleException(Exception ex){Result<Object> result=new Result<>();result.setCode(507);result.setMessage("服务器内部错误");return result;}
}
ExceptionController控制器
package com.study.springboot_exception.controller;import com.study.springboot_exception.event.Result;
import com.study.springboot_exception.exception.MyBusinessException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** 处理系统中可能出现的两种异常:产品空指针异常和自定义异常*/
@RestController
public class ExceptionController {/*** 系统内部错误*/@GetMapping("/exception")public Result testException(){int i=1/0;//该语句会触发算数异常,进入全局异常处理类,所以不会执行下面的语句Result<Object> result=new Result<>();result.setCode(200);result.setMessage("success");result.setData("cc");return result;}/*** 自定义异常*/@GetMapping("/myException")public Result testMyException(){throw new MyBusinessException(508,"自定义的异常");}
}
SpringbootExceptionApplication启动类
package com.study.springboot_exception;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class SpringbootExceptionApplication {public static void main(String[] args) {SpringApplication.run(SpringbootExceptionApplication.class, args);}}
启动项目
- 访问网址:http://localhost:8080/exception
- int i=1/0; 会触发算术异常,在全局异常处理类中归属“其他未知异常”来进行处理

访问网址:http://localhost:8080/myException,触发自定义异常

相关文章:
SpringBoot——全局异常处理
目录 异常 项目总结 新建一个SpringBoot项目 pom.xml Result(通用的响应结果类) MyBusinessException自定义异常类 GlobalExceptionHandler全局异常处理类 ExceptionController控制器 SpringbootExceptionApplication启动类 参考文章:…...
SpringBoot+Vue教师工作量管理系统(前后端分离)
技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 教师管理员 功能截图...
华为OD技术面试-最长回文串-2024手撕代码真题
题目:最长回文串 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的 回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串。 示例 1: 输入:s = "abccccdd" 输出:7 解释: 我们可以构造的最…...
Python实现连连看8
4 游戏开始 连连看游戏实际上主要完成的是对玩家鼠标点击事件的处理,也就是对鼠标点击事件的响应。 4.1 添加鼠标点击事件响应 在“1.3.4 在窗口上铺设画布”中提到的将画布pack()到窗口代码之前,写入如下代码,其功能是为鼠标点击事件添加响应。 canvas.bind(<Button…...
[Cloud Networking] Layer Protocol (continue)
文章目录 1. STP / RSTP / MSTP Protocol1.1 STP的作用1.2 STP 生成树算法的三个步骤1.3 STP缺点 2. ARP Protocol3. DHCP Protocol3.1 DHCP 三种分配方式3.2 DHCP 攻击 4. IPSEC / MACSEC 1. STP / RSTP / MSTP Protocol 1.1 STP的作用 消除二层环路:通过阻断冗余…...
人工智能在交通与物流领域的普及及应用
文章目录 🐋引言 🐋自动驾驶 🦈自动驾驶汽车 🐡应用现状 🐡技术实现 🐡实现过程及代码 🐋智能交通管理 🦈应用现状 🦈技术实现 🦈实现过程及代码 &…...
JVM学习-详解类加载器(二)
双亲委派机制 双亲委派优势 避免类的重复加载,确保一个类的全局唯一性 Java类随着它的类加载器一起具备了一种带有优先级的层次关系,通过这种层次关系可以避免类的重复加载,当父类已经加载了该类,就没有必要子ClassLoader再加载…...
数字校园的优势有哪些
数字化时代下,数字校园已成为教育领域一股显著趋势。数字校园旨在借助信息技术工具对传统校园进行改造,提供全新的教学、管理和服务方式。那么,数字校园究竟具备何种优势?现从三个方面为您详细介绍。 首先,数字校园为教…...
DexCap——斯坦福李飞飞团队泡茶机器人:更好数据收集系统的原理解析、源码剖析
前言 2023年7月,我司组建大模型项目开发团队,从最开始的论文审稿,演变成目前的两大赋能方向 大模型应用方面,以微调和RAG为代表 除了论文审稿微调之外,目前我司内部正在逐一开发论文翻译、论文对话、论文idea提炼、论…...
【Mtk Camera开发学习】01 MTK 平台Camera BringUp
本专栏内容针对 “知识星球”成员免费,欢迎关注公众号:小驰行动派,加入知识星球。 #MTK Camera开发学习系列 #小驰私房菜 这篇文章主要介绍MTK 平台,Camera BringUp会涉及到修改的模块。 MTK不同的平台系列,具体修改…...
新能源汽车内卷真相
导语:2025年,我国新能源汽车总产能预计可达3661万辆,如此产能如何消化? 文 | 胡安 “这样卷下去不是办法,企业目的是什么?是盈利,为国家作贡献,为社会作贡献。我们应该有大格局&…...
C 语言实现在终端里输出二维码
Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…...
nodejs---fs模块,文件读写操作详解,自定义一个文件写入方法
fs模块导入 Node.js 同时支持 CommonJS 和 ES 模块系统(自 Node.js v12 以来) // 两种模块导入方式 import * as fs from fs;// Es6:这种方式需要在package.json中配置"type": "module" const fs require(fs);// commonJs:如果你…...
Linux(Rocky)下 如何输入中文(切换中文输入法)教程
RockyLinux如何输入中文(切换中文输入法) 注意 在字符画界面的Linux系统中 默认不具备中文输入法的功能 需要SSH或其他远程工具来实现 问题 可能大家有的时候安装了一个虚拟机之后 想切换中文输入法 但是一直找不到方法 下面将利用Rocky9.2作为演示…...
Python中包(package)与模块(module)的概念 以及 import 问题
目录 Python中 包(package) 与 模块(module) 的概念一. Python中, 包 (package) 与 模块 (module) 的概念1. 一个有 __init__.py 文件 的目录, 被视为一个 Python 的 包 (package)2. 一个Python源文件 , 被视为一个模块 (module) 二. 不同包之间 以及 同一个包的不同模块之间的…...
Android常见内存泄漏场景总结
一、非静态内部类造成的内存泄漏 造成原因:非静态内部类默认会持有外部类的引用,如果内部类的生命周期超过了外部类就会造成内存泄漏。 场景:当Activity销毁后,由于内部类中存在异步耗时任务还在执行,导致Activity实…...
未来已来:Angular、React、Vue.js——前端框架的三大巨头
目录 前言 一、Angular框架 特点和优势 核心技术和应用场景 二、React框架 特点和优势 核心技术和应用场景 三、Vue.js框架 特点和优势 核心技术和应用场景 总结: 前言 在Web前端开发领域,随着技术的不断发展,出现了众多优秀的框…...
Mybatis06-动态SQL
动态SQL 1.什么是动态SQL 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 类似JSTL标签 官网描述: MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接…...
26-LINUX--I/O复用-select
一.I/O复用概述 /O复用使得多个程序能够同时监听多个文件描述符,对提高程序的性能有很大帮助。以下情况适用于I/O复用技术: ◼ TCP 服务器同时要处理监听套接字和连接套接字。 ◼ 服务器要同时处理 TCP 请求和 UDP 请求。 ◼ 程序要同时处理多个套接…...
spring源码解析-(2)Bean的包扫描
包扫描的过程 测试代码: // 扫描指定包下的所有类 BeanDefinitionRegistry registry new SimpleBeanDefinitionRegistry(); // 扫描指定包下的所有类 ClassPathBeanDefinitionScanner scanner new ClassPathBeanDefinitionScanner(registry); scanner.scan(&quo…...
暗黑破坏神2存档编辑器:5分钟掌握你的游戏命运
暗黑破坏神2存档编辑器:5分钟掌握你的游戏命运 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 还在为暗黑破坏神2的重复刷怪而烦恼吗?想快速体验各种强力build却不想花费数百小时练级?d2s-edi…...
JSON数据同步利器:深度解析ogre-software/json-synchronizer的核心原理与应用
1. 项目概述:一个被低估的JSON数据同步利器如果你经常和JSON数据打交道,尤其是在前后端分离、微服务架构或者多数据源集成的场景下,你肯定遇到过这样的烦恼:手头有两份甚至多份JSON数据,它们结构相似,但内容…...
reverse-shell在企业安全测试中的最佳实践:风险评估与合规使用
reverse-shell在企业安全测试中的最佳实践:风险评估与合规使用 【免费下载链接】reverse-shell Reverse Shell as a Service 项目地址: https://gitcode.com/gh_mirrors/re/reverse-shell reverse-shell作为一款开源的"Reverse Shell as a Service"…...
Intel Stratix 10 SoC:三层异构计算架构与ARM Cortex-A53的工程实践
1. 项目概述:Altera Stratix 10 SoC的“秘密武器”2013年,当Altera(现为Intel PSG)在EE Times上揭开其Stratix 10片上系统(SoC)的神秘面纱时,整个嵌入式与高性能计算领域都为之侧目。核心的爆点…...
sed文本处理实战:从基础语法到高阶场景解析
1. 为什么你需要掌握sed? 第一次接触sed时,我也觉得这个命令行工具看起来晦涩难懂。直到有次需要处理一个500MB的日志文件,用文本编辑器直接打开卡死,用Excel根本加载不了,这时候sed只用一行命令就搞定了数据清洗&…...
Inter字体性能优化终极指南:如何让你的网页加载速度提升70% [特殊字符]
Inter字体性能优化终极指南:如何让你的网页加载速度提升70% 🚀 【免费下载链接】inter The Inter font family 项目地址: https://gitcode.com/gh_mirrors/in/inter 你知道吗?一个未优化的字体文件可能让你的网页加载时间增加30%以上&…...
AI应用框架Weam:微服务化架构与工作流编排实战
1. 项目概述:一个面向未来的AI应用框架 最近在AI应用开发领域,一个名为“Weam”的项目开始引起不少开发者的注意。它不是一个具体的AI模型,而是一个旨在构建、管理和部署AI应用的开源框架。简单来说,你可以把它想象成一个“AI应用…...
本地化部署AI做表格工具评测:数以轻舟Agent技术架构与落地实践
一、产品定位与核心架构数以轻舟Agent是一款面向Excel数据处理场景的垂直型AI智能体,由北京乾策数智科技有限公司开发,2025年12月推出首款产品,2026年5月正式上线本地化部署版本。产品核心定位并非通用AI助手,而是聚焦"AI做表…...
5分钟掌握全能文档下载神器:告别付费壁垒,解放你的知识获取能力
5分钟掌握全能文档下载神器:告别付费壁垒,解放你的知识获取能力 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档&#x…...
AI 入门 30 天挑战 - Day 28 - 前沿技术概览
🌟 完整项目和代码 本教程是 AI 入门 30 天挑战 系列的一部分! 💻 GitHub 仓库: https://github.com/Lee985-cmd/AI-30-Day-Challenge📖 CSDN 专栏: https://blog.csdn.net/m0_67081842?typeblog⭐ 欢迎 Star 支持!…...

