Spring Boot 进阶-Spring Boot的全局异常处理机制详解

我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了try catch finally语句。
大量的try catch语句不但增加了代码的冗余,而且还降低了代码的可读性。所以在Spring Boot 中就有人想将这些try catch的异常处理通过全局的方式进行处理,也就是说在我们正常的开发中就不需要再去关心这些异常的处理了。我们只需要在一个地方进行统一的配置就可以完成全局异常的处理了。
全局异常处理介绍
其实在Spring 3.x的版本中就已经有全局异常处理的注解被提出使用了。例如@ControllerAdvice、@ExceptionHandler、@InitBinder、@ModelAttribute 等等注解。
而这些注解从字面上来看与异常有关的就只有一个@ExceptionHandler 注解,也就是异常处理器的关键注解。其实在Spring中的异常处理机制有两种,一种是全局异常处理、一种是局部异常处理。那么什么是全局异常处理?什么是局部异常处理?
首先局部异常处理顾名思义就是在某些方法或者某些类上对该类中存在的异常进行处理,主要使用的注解就是@ExceptionHandler和@Controller两个注解。这里需要注意的是只有指定了@Controller的类才会被@ExceptionHandler注解所捕获到对应的异常,在实际开发过程中,Controller是不可控的,所以说,这个方式显然不适合在大批量的Controller中使用。那么这就需要用到我们的全局异常处理机制了
全局异常处理机制,首先来讲它可以完成的异常处理在数量上远比局部异常处理要多,其次就是它需要建立一种与局部异常处理机制不同的异常处理全局捕获的方式。所以就出现了@ControllerAdvice注解,,这个注解搭配上@ExceptionHandler 就可以彻底解决全局异常处理的问题。当然后续还出现了@RestControllerAdvice注解,其实这个注解与@ControllerAdvice注解的区别与联系就如同前面提到过的@Controller注解与@RestController注解是类似的,都是Response的返回值进行了序列化的处理。
Spring Boot中的异常分类
我们知道其实异常处理是Java语言本身的特性,所以Java语言本身就会有很多的异常,更不用说是在SpringBoot中存在的异常了,也是非常多的。
这里我们根据Spring Boot中的业务场景不同来对异常进行分类。一种就是进入业务之前的异常,一种就是在业务逻辑中的异常。如图所示,图片来源网络。

在进入业务逻辑之前的异常一般是由Servlet操作引起的,一般需要处理的异常有如下一些
- NoHandlerFoundException:表示客户端的请求在服务端没有找到对应的处理器,这个异常会抛出404的错误。
- HttpRequestMethodNotSupportedException:从异常描述可以知道,它表示在使用HTTP请求的时候请求方法不支持,也就是说原本该使用GET请求的方法,使用了POST请求方法,这个异常会抛出405的错误
- HttpMediaTypeNotSupportedException:这个异常表示客户端请求的媒体类型错误,也就是说原本需要使用JSON数据请求的却用的是x-form-data的数据进行请求。一般会抛出415的异常
- MissingPathVariableException:表示路径参数未找到,一般就是参数传输错误,引起的错误就是400的错误。
而进入业务逻辑之后的异常则是有代码内部引起的一般常见的错误就是空指针异常。这个需要根据具体的业务逻辑以及对应的业务场景进行处理。
在Spring Boot中如何对这些异常进行统一处理呢?
在异常处理的时候一般开发人员关注的就是什么地方的异常,出现异常的原因是什么?在我们统一处理的时候需要注意哪些问题?下面我们就带着这些问题一一来解答。
统一异常处理的步骤很简单,我们还是以前面创建的项目来做演示
- 第一步、需要创建一个全局异常处理的处理类
- 第二步、在这个类上标注@RestControllerAdvice注解,或者使用@ControllerAdvice 和@ResponseBody组合来实现
- 第三步、方法上标注上对应的异常处理的注解@ExceptionHandler,并且指定需要捕获的异常是什么,也可以指定多个。
根据以上的步骤我们来创建对应的处理代码。
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {@ExceptionHandler(TestException.class)public String testExceptionHandler(TestException testException){log.info("全局异常处理",testException.getMessage());return "异常被全局捕获";}}
自定义异常
相关文章:
Spring Boot 进阶-Spring Boot的全局异常处理机制详解
我们知道在软件运行的过程中,总会出现各种各样的问题,各种各样的异常,而程序员的主要任务之一就是解决在程序运行过程中出现的这些异常。在很多程序员开发的代码中我们会看到在关键的地方为了保证程序能够有一个正常的反馈,大量地使用了try catch finally语句。 大量的try …...
滚雪球学MySQL[7.1讲]:安全管理
全文目录: 前言7. 安全管理7.1 用户与权限管理7.1.1 创建和管理用户7.1.2 权限分配与管理7.1.3 最小权限原则 7.2 安全策略配置7.2.1 使用加密连接7.2.2 强密码策略7.2.3 定期审计和日志管理 7.3 SQL注入防范7.3.1 使用预处理语句7.3.2 输入验证与清理7.3.3 最小化数…...
反射及其应用---->2
目录 1.使用类对象 1.1创建对象 1.2使用对象属性 1.3使用方法 2.反射操作数组 3.反射获得泛型 4.类加载器 4.1双亲委派机制 4.2自定义加载器 1.使用类对象 通过反射使用类对象,主要体现3个部分 创建对象,调用方法,调用属性ÿ…...
[Python学习日记-32] Python 中的函数的返回值与作用域
[Python学习日记-32] Python 中的函数的返回值与作用域 简介 返回值 作用域 简介 在函数的介绍中我们提到了函数的返回值,当时只是做了简单的介绍,下面我们将会进行详细的介绍和演示,同时也会讲一下 Python 中的作用域,作用域分…...
儿童发光耳勺值得买吗?儿童发光耳勺最建议买的五个牌子!
儿童耳部清洁需谨慎,发光耳勺能在光线不足时提供照明,便于看清耳道。但不同产品质量参差不齐,选择时需综合考虑安全性、实用性等因素,为孩子的耳部健康做出正确选择! 这里给大家总结了全新的儿童发光耳勺的避雷指南&am…...
TIPS 二进制程序暴露符号给动态链接库使用
背景 在支持插件/扩展的C/C系统中,通常会支持在程序运行时加载动态链接库。这时二进制程序会提供一些函数/接口让动态链接库调用,但是这些函数在二进制程序中又不会使用,导致在编译时编译器直接把这些符号删除了,加载链接库就会由…...
【分布式微服务云原生】8分钟掌握微服务通信的艺术:Dubbo与OpenFeign全面解析
摘要: 在构建微服务架构时,服务间的通信机制是核心要素之一。Dubbo和OpenFeign是两个非常流行的服务调用框架,它们各有千秋,适用于不同的场景。本文将深入探讨Dubbo和OpenFeign的主要特点、使用场景以及它们之间的差异,…...
sicp每日一题[2.33]
Exercise 2.33 Fill in the missing expressions to complete the following definitions of some basic list-manipulation operations as accumulations: ; p 表示一个函数,sequence 表示一个列表 ; 这个函数将对列表中每一个元素进行 p 操作 (define (map p sequ…...
【Mybatis】常见面试题汇总 共56题
文章目录 1. 介绍下MyBatis?2. MyBatis 框架的应用场景?3. MyBatis 有哪些优点?4. MyBatis 有哪些缺点?5. MyBatis 用到了哪些设计模式?6. MyBatis常用注解有哪些?7. MyBatis 有哪些核心组件?8. MyBatis编程步骤是什么样的?9. MyBatis 和…...
每天一道面试题(17):服务网格学习笔记
什么是服务网格? 服务网格(Service Mesh)是处理微服务间通信的一种基础设施层。它主要用于解耦服务间的通信与业务逻辑,使开发者可以专注于业务实现。服务网格在微服务架构的演进中扮演了重要角色,特别是在解决服务间…...
【nrm】npm 注册表管理器
nrm是什么 nrm(NPM Registry Manager)是一个用于管理 Node.js 包管理器(如 npm 和 Yarn)的注册表工具。它可以帮助用户快速切换不同的 npm 源,以便于提高包安装的速度和效率,特别是在中国大陆地区…...
解压短视频素材资源网站推荐
如果你正在寻找解压短视频素材,那么这篇文章正是为你而写!以下是一些热门的网站,帮助你轻松找到所需的素材,快来看看吧! 蛙学网 蛙学网是国内领先的视频素材网站,提供丰富的解压视频素材。无论是放松心情的…...
Qemu开发ARM篇-6、emmc/SD卡AB分区镜像制作并通过uboot进行挂载启动
文章目录 1、AB分区镜像制作2、uboot修改3、镜像启动 在上一篇 Qemu开发ARM篇-5、buildroot制作根文件系统并挂载启动中,我们通过buildroot制作了根文件系统,并通过 SD卡的形式将其挂载到设备并成功进行了启动,但上一章中,我们的…...
Spring Boot中使用ThreadPoolTaskScheduler实现轻量级多线程定时任务
引言 在Java开发中,Spring Boot提供了多种方式来执行定时任务,如Scheduled注解和TaskScheduler。当需要执行多线程定时任务时,ThreadPoolTaskScheduler是一个轻量级的解决方案。本文将通过一个具体的业务场景,介绍如何使用Thread…...
完全二叉树的节点个数 C++ 简单问题
完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。 示例 1ÿ…...
每日一题学习笔记
给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。 如果可以,返回 true ;否则返回 false 。 magazine 中的每个字符只能在 ransomNote 中使用一次。 示例 1: 输入&#…...
从事人工智能学习Python还是学习C++?
人工智能(Artificial Intelligence,简称AI)是当今科技领域最热门的研究方向之一。AI 涉及多个学科和技术,特别是机器学习、神经网络、深度学习等技术的应用。在AI的开发过程中,编程语言的选择对于开发效率和项目实现至…...
博客摘录「 CNN中的感受野和有效感受野会对模型产生怎样的影响?」2024年9月29日
,中心像素受影响较大,离中心越远梯度信号越弱。梯度信号的衰减是指数级的,这意味着应用于感受野的大多数像素的梯度将是可忽略的(如果有的话)。 有效感受野的定义...
AURIX单片机示例:开发入门与点亮LED
文章目录 目的模板工程Blinky_LED示例链接总结 目的 这个例程比较简单,主要通过这个例程来介绍 AURIX™ Development Studio(ADS) 和 iLLD 库来开发 AURIX 系列单片机一些入门的内容。一些更为基础的资料等内容可以参考下面文章: 《英飞凌 AURIX TriCo…...
MySQL字符串函数与操作
在编程领域中,字符串操作是数据处理中至关重要的一部分。无论是文本分析、日志处理,还是格式化输出,字符串的操作技能都能极大提高工作效率。在 Python 中,字符串相关的函数和方法为开发者提供了强大的工具,帮助完成各种任务。了解如何灵活运用这些工具,能够有效提升编程…...
MSE、MAE、Binary/Categorical Cross-Entropy、HingeLoss五种损失函数的典型应用场景
目录第一类:回归任务(预测具体数值)👓1. MSE (均方误差) —— 重罚离群点👓2. MAE (平均绝对误差) —— 鲁棒性强第二类:分类任务(判断属于哪一类)👓3. Binary Cross-Ent…...
python vue基于hadoop的高校图书馆借阅阅读书目智慧推荐系统
目录技术架构设计数据采集与存储模块数据处理与分析模块推荐算法实现Vue前端开发系统部署方案测试与优化项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作技术架构设计 系统采用前后端分离架构,前端使用Vue.js框架开…...
4步精通OpenCore EFI制作:OpCore-Simplify智能配置引擎全解析
4步精通OpenCore EFI制作:OpCore-Simplify智能配置引擎全解析 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在黑苹果技术领域࿰…...
VeraCrypt实战指南:从取证入门到加密容器构建
1. VeraCrypt初探:数字取证中的"保险箱" 第一次接触VeraCrypt是在去年的网络安全竞赛上。当时有个加密容器文件摆在面前,队友急得直挠头:"这玩意儿怎么打开?"我盯着那个看似普通的文件,突然意识到…...
FPGA加速二值化CNN:从MNIST手写识别到硬件优化实践
1. 二值化神经网络与FPGA加速基础 二值化神经网络(BNN)是近年来边缘计算领域的重要突破,它将传统神经网络中的32位浮点权重和激活值压缩到仅用1位表示(1或-1)。这种极端量化带来的直接好处是存储需求降低32倍ÿ…...
主流开源License深度解析:从BSD到CC的适用场景与商业考量
1. 开源许可证的本质与核心价值 第一次接触开源许可证时,我和大多数人一样困惑:为什么明明是我的代码,却需要别人来告诉我怎么使用?后来在参与多个开源项目后才发现,许可证就像代码世界的交通规则,它不是为…...
3大核心功能打造专业级开源服装设计解决方案
3大核心功能打造专业级开源服装设计解决方案 【免费下载链接】Seamly2D Open source patternmaking software to democratize fashion. 项目地址: https://gitcode.com/gh_mirrors/se/Seamly2D Seamly2D作为一款开源服装制版软件,通过参数化设计、精确测量管…...
TradingView策略优化:基于机器学习的智能交易系统设计与实现
TradingView策略优化:基于机器学习的智能交易系统设计与实现 【免费下载链接】TradingView Start your trading journey with this projects advanced stop loss/take profit generator, enhancing your TradingView strategy. Utilize sklearns machine learning a…...
24小时运行OpenClaw:nanobot定时任务监控方案
24小时运行OpenClaw:nanobot定时任务监控方案 1. 为什么需要24小时运行的OpenClaw? 去年夏天,我因为忘记备份一个重要项目文件而损失了三天的工作量。当时就想,如果能有个"数字管家"帮我定时执行这些重复性任务该多好…...
Keil“魔法棒”全解析:从Device到Utilities的配置秘籍
1. 认识Keil的"魔法棒":Options for Target对话框 第一次打开Keil MDK时,工具栏上那个带着星星的魔法棒图标总是特别引人注目。这个被开发者亲切称为"魔法棒"的按钮,实际上是整个开发环境中最强大的配置中心——Options …...
