2023.12.4 关于 Spring Boot 统一异常处理
目录
引言
统一异常处理
异常全部监测
引言
- 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性
- 统一的异常处理使得调试和维护变得更加容易,通过集中处理异常,开发人员可以更轻松地定位和解决应用程序中的问题,而不必在整个代码库中查找异常处理逻辑
- 自定义异常处理器能够提供更友好、可读性更强的错误信息,使用户更容易理解问题的本质,这对于客户端开发人员和最终用户都是有益的
统一异常处理
- 在程序运行时,难免会产生一些异常错误
- 当后端发生异常时,前端将无法正确获取到数据
实例理解
- 此处我们创建一个 UserController 类,并编写一个存在空指针异常的 test 方法
package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/user") public class UserController {@RequestMapping("/test")public int test() {Object obj = null;obj.hashCode();return 1;} }
- 在浏览器中输入对应的 URL,来访问调用 UserController 类中的 test 方法
- 我们发现浏览器直接显示 500,表示服务器错误
- 此时前端是无法对该页面进行处理的
- 因此无论是否出现异常,后端都应该给前端返回约定格式的数据,这时候统一的异常处理就非常有必要了
package com.example.demo.component;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;@ControllerAdvice @ResponseBody public class MyExceptionAdvice {@ExceptionHandler(NullPointerException.class)public HashMap<String,Object> doNullPointerException(NullPointerException e) { // 自定义异常处理HashMap<String,Object> result = new HashMap<>();result.put("code",-1);result.put("msg","异常类型:" + e);result.put("data",null);return result;} }
- @ControllerAdvice 注解用于定义全局控制器通知,它允许将全局性的处理逻辑应用于整个应用程序中的多个控制器
- @ExceptionHandler 注解用于处理整个应用程序中发生的异常,即 当任何控制器抛出异常时,可以在这里定义统一的处理逻辑,而不需要在每个控制器中单独处理
- 通过对空指针异常的统一处理
- 我们实现了当 控制器 出现空指针异常时,后端将会返回一个包含错误信息的 JSON 对象,该对象包含 错误码、错误信息、数据
- 该JSON 对象有助于前端对其进行相应的处理
异常全部监测
- 在生产环境中,我们可能会无意识的写出一些错误代码而导致各种出现异常,这是很难预料到的
- 如 算数异常、数组越界异常、类型转换异常 等
- 但是我们有必要针对每一个异常都写一个单独的处理方法吗?如上文对 空指针异常 处理的 doNullPointerException 一样
- 这显然是没必要的
- 因为 我们可以对所有异常进行统一处理,对个别有要求的异常进行特殊处理
实例理解
- 此处我们创建一个 UserController 类,并编写一个存在 数组越界异常的 arr 方法
package com.example.demo.controller;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;@RestController @RequestMapping("/user") public class UserController {@RequestMapping("/arr")public int arr() {int[] array = new int[3];for (int i = 0; i < 4; i++) {array[i] = i;}return 1;} }
- 此处我们直接对 Exception 进行异常统一处理
- Exception 是所有异常的父类
package com.example.demo.component;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;@ControllerAdvice @ResponseBody public class MyExceptionAdvice {@ExceptionHandler(Exception.class)public HashMap<String,Object> doException(Exception e) { // 自定义异常处理HashMap<String,Object> result = new HashMap<>();result.put("code",-2);result.put("msg","异常类型:" + e);result.put("data",null);return result;} }
- 在浏览器中输入对应的 URL,来访问调用 UserController 类中的 arr 方法
- 成功返回了一个包含错误信息的 JSON 对象,且异常类型为 数组越界异常
实例理解二
- 此处我们对 Exception ,即所有异常的父类 进行了异常统一处理
- 此外我们还单独对 NullPointException ,即空指针异常 进行了异常统一处理
package com.example.demo.component;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;@ControllerAdvice @ResponseBody public class MyExceptionAdvice {@ExceptionHandler(Exception.class)public HashMap<String,Object> doException(Exception e) { // 自定义异常处理HashMap<String,Object> result = new HashMap<>();result.put("code",-2);result.put("msg","异常类型:" + e);result.put("data",null);return result;}// 对 空指针异常进行特殊处理@ExceptionHandler(NullPointerException.class)public HashMap<String,Object> doNullPointerException(NullPointerException e) { // 自定义异常处理HashMap<String,Object> result = new HashMap<>();result.put("code",-1);result.put("msg","异常类型:" + e);result.put("data",null);return result;} }
- 此时在浏览器中输入对应的 URL 对上文存在空指针异常的 test 方法进行访问调用
- 由上图可知,当 父类和子类异常 同时存在的情况下,优先子类自己的异常处理
- 从而可以实现 对所有异常进行统一处理,对个别有要求的异常进行单独的特殊处理
相关文章:
2023.12.4 关于 Spring Boot 统一异常处理
目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方,可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码,这降低了代码的冗余,提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易,通…...
企业网络安全守护者:EventLog Analyzer日志审计系统
在当今数字时代,企业网络不仅仅是业务运营的核心,也成为各种潜在威胁的目标。为了保障企业的网络安全,日志审计系统成为了不可或缺的一环。其中,ManageEngine的EventLog Analyzer作为一款强大而全面的日志管理与审计解决方案&…...
剪映最新版的4.9,主要更新的功能(于2023年12月2日发布)
新增“多轨道音频”功能:用户可以将多个音频轨道叠加在一起,并对每个音频轨道进行单独的编辑。这使得用户可以更灵活地控制视频的音频效果。新增“音频调音”功能:用户可以使用音频调音功能对视频的音频进行调节,包括音量、音调、…...
IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis核心配置详解
第一章 Mybatis核心配置详解【mybatis-config.xml】 1.1 核心配置文件概述 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 1.2 核心配置文件根标签 没有实际语义,主要作用:所有子标签均需要设置在跟标签内部 1.3 核心配置文件…...
maven-profile
指定profile生效的几种方式 maven中profile的使用详解_maven profile_2021不再有雨的博客-CSDN博客 【Maven】【翻译】3、Profiles文件_maven的profiles文件是什么-CSDN博客 查看当前生效的profile mvn help:active-profiles 比如有些是用activeProfiles在pom中指定的&…...
用python找到音乐数据的位置,并实现音乐下载
嗨喽~大家好呀,这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 需求分析: 有什么需求要实现? 这些需求可以用什么技术实现? 找到音乐数据的位置, 分析 不同音乐的链接有何规律?https://lx-sycdn.kuwo.cn/b784688662c82db8…...
MATLAB算法实战应用案例精讲-【图像处理】边缘检测(补充篇)(附MATLAB代码实现)
目录 前言 几个相关概念 知识储备 数字图像处理(Digital Image Processing)...
黑马头条数据管理平台项目总结
今天主要看了该项目的介绍,这个黑马头条数据管理平台项目主要包括登录、用户的权限判断、文章内容列表的筛选和分页、文章的增删查改还有图片和富文本编辑器这几大部分组成,项目配套了素材代码,像资源文件、第三方插件、页面文件夹、工具插件…...
IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)
除此之外,其他常用的光标移动快捷键包括: Shift 滚轮前后滚动:当前文件的横向滚动轴滚动。Shiftenter:快速将鼠标移动到下一行。Ctrl ]:移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键:光标跳转…...
对标Gen-2!Meta发布新模型,进军文生视频赛道
随着扩散模型的飞速发展,诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢,因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…...
zabbix的自动发现机制、代理功能、SNMP监控
一、自动发现(不安全,有时会失效,建议手动添加主机) 1、定义 zabbix主动与服务端联系,将自己的地址和端口发送给服务端,实现自动添加监控主机 客户端是主动的一方 2、缺点 若自定义网段中主机数量太多…...
spring webflux文件上传与下载
1、文件上传: Controller: PostMapping("/import")public void importImage(RequestPart("file") FilePart filePart) {imageService.importImage(filePart);}Service: public void importImage(FilePart filePart) {Fi…...
Android MVVM+coroutine+retrofit+flow+hilt
文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构: 依赖注入层 数据库: Module InstallIn(SingletonComponent::class) class DBModule {Singleto…...
elasticsearch副本和分片
1.文档冲突 当我们使用index API更新文档,可以一次性读取 修改索引副本 rootes-node3:~# curl -XPUT http://192.168.1.136:9200/es-syslog-2023.08.26/_settings -H "Content-Type: application/json" -d { > "settings": { > …...
【Python】zip
Python中的zip()函数可以将多个可迭代对象打包成一个元组序列,然后返回这些元组序列组成的迭代器。zip()函数的语法如下: zip(*iterables)其中,iterables是可迭代对象,可以是多个,也可以是一个。zip()函数将返回一个迭…...
西安安泰——ATA-1220E宽带放大器
ATA-1220E宽带放大器简介 ATA-1220E是一款可放大交直流信号的差分通道宽带放大器。其最大输出电压 60Vp-p(30Vp),最大输出电流1Ap(>50Hz)。电压增益数控可调,一键保存设置,提供了方便简洁的操作选择,可…...
数据结构和算法专题---4、限流算法与应用
本章我们会对限流算法做个简单介绍,包括常用的限流算法(计数器、漏桶算法、令牌桶案发、滑动窗口)的概述、实现方式、典型场景做个说明。 什么是限流算法 限流是对系统的一种保护措施。即限制流量请求的频率(每秒处理多少个请求…...
亚信安慧AntDB受邀分享核心业务系统全域数据库替换实践
近日,亚信安慧AntDB数据库凭借丰富的核心业务系统升级替换能力和经验,受邀参与IT168组织的第三期“国产软硬件升级替换之路”的直播沙龙。 亚信安慧AntDB数据库相关负责人发表《基于AntDB的CRM全域数据库替换实践》的精彩演讲,通过通信行业率…...
1.uniapp基础
1.uniapp基础 官方文档:uni-app官网 1.1开发工具 (1)工具: HBuilderX HBuilderX-高效极客技巧 1.2 新建项目 (1) 文件》新建项目 (2)选择相应的配置信息,填写项目根路…...
typescript中的策略模式
typescript中的策略模式 当我们需要以整洁、易于维护和易于调试的方式构建应用程序时,使用设计模式是一种非常好的方式。 在本文中,我们的目标是阐明如何将策略模式无缝地集成到我们的应用程序中。如果我们熟悉依赖性注入,可能会发现策略模…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Git常用命令完全指南:从入门到精通
Git常用命令完全指南:从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...



