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

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 统一异常处理

目录 引言 统一异常处理 异常全部监测 引言 将异常处理逻辑集中到一个地方&#xff0c;可以避免在每个控制器或业务逻辑中都编写相似的异常处理代码&#xff0c;这降低了代码的冗余&#xff0c;提高了代码的可维护性统一的异常处理使得调试和维护变得更加容易&#xff0c;通…...

企业网络安全守护者:EventLog Analyzer日志审计系统

在当今数字时代&#xff0c;企业网络不仅仅是业务运营的核心&#xff0c;也成为各种潜在威胁的目标。为了保障企业的网络安全&#xff0c;日志审计系统成为了不可或缺的一环。其中&#xff0c;ManageEngine的EventLog Analyzer作为一款强大而全面的日志管理与审计解决方案&…...

剪映最新版的4.9,主要更新的功能(于2023年12月2日发布)

新增“多轨道音频”功能&#xff1a;用户可以将多个音频轨道叠加在一起&#xff0c;并对每个音频轨道进行单独的编辑。这使得用户可以更灵活地控制视频的音频效果。新增“音频调音”功能&#xff1a;用户可以使用音频调音功能对视频的音频进行调节&#xff0c;包括音量、音调、…...

IDEA版SSM入门到实战(Maven+MyBatis+Spring+SpringMVC) -Mybatis核心配置详解

第一章 Mybatis核心配置详解【mybatis-config.xml】 1.1 核心配置文件概述 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 1.2 核心配置文件根标签 没有实际语义&#xff0c;主要作用&#xff1a;所有子标签均需要设置在跟标签内部 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找到音乐数据的位置,并实现音乐下载

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 需求分析: 有什么需求要实现? 这些需求可以用什么技术实现? 找到音乐数据的位置, 分析 不同音乐的链接有何规律?https://lx-sycdn.kuwo.cn/b784688662c82db8…...

MATLAB算法实战应用案例精讲-【图像处理】边缘检测(补充篇)(附MATLAB代码实现)

目录 前言 几个相关概念 知识储备 数字图像处理(Digital Image Processing)...

黑马头条数据管理平台项目总结

今天主要看了该项目的介绍&#xff0c;这个黑马头条数据管理平台项目主要包括登录、用户的权限判断、文章内容列表的筛选和分页、文章的增删查改还有图片和富文本编辑器这几大部分组成&#xff0c;项目配套了素材代码&#xff0c;像资源文件、第三方插件、页面文件夹、工具插件…...

IDEA中,光标移动快捷键(Shift + 滚轮前后滚动:当前文件的横向滚动轴滚动。)

除此之外&#xff0c;其他常用的光标移动快捷键包括&#xff1a; Shift 滚轮前后滚动&#xff1a;当前文件的横向滚动轴滚动。Shiftenter&#xff1a;快速将鼠标移动到下一行。Ctrl ]&#xff1a;移动光标到当前所在代码的花括号结束位置。Ctrl 左方向键&#xff1a;光标跳转…...

对标Gen-2!Meta发布新模型,进军文生视频赛道

随着扩散模型的飞速发展&#xff0c;诞生了Midjourney、DALLE 3、Stable Difusion等一大批出色的文生图模型。但在文生视频领域却进步缓慢&#xff0c;因为文生视频多数采用逐帧生成的方式,这类自回归方法运算效率低下、成本高。 即便使用先生成关键帧,再生成中间帧新方法。如…...

zabbix的自动发现机制、代理功能、SNMP监控

一、自动发现&#xff08;不安全&#xff0c;有时会失效&#xff0c;建议手动添加主机&#xff09; 1、定义 zabbix主动与服务端联系&#xff0c;将自己的地址和端口发送给服务端&#xff0c;实现自动添加监控主机 客户端是主动的一方 2、缺点 若自定义网段中主机数量太多…...

spring webflux文件上传与下载

1、文件上传&#xff1a; Controller&#xff1a; PostMapping("/import")public void importImage(RequestPart("file") FilePart filePart) {imageService.importImage(filePart);}Service&#xff1a; public void importImage(FilePart filePart) {Fi…...

Android MVVM+coroutine+retrofit+flow+hilt

文章目录 Android MVVMcoroutineretrofitflowhilt概述依赖注入层数据层视图层模型视图层代码下载 Android MVVMcoroutineretrofitflowhilt 概述 代码结构&#xff1a; 依赖注入层 数据库&#xff1a; Module InstallIn(SingletonComponent::class) class DBModule {Singleto…...

elasticsearch副本和分片

1.文档冲突 当我们使用index API更新文档&#xff0c;可以一次性读取 修改索引副本 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()函数可以将多个可迭代对象打包成一个元组序列&#xff0c;然后返回这些元组序列组成的迭代器。zip()函数的语法如下&#xff1a; zip(*iterables)其中&#xff0c;iterables是可迭代对象&#xff0c;可以是多个&#xff0c;也可以是一个。zip()函数将返回一个迭…...

西安安泰——ATA-1220E宽带放大器

ATA-1220E宽带放大器简介 ATA-1220E是一款可放大交直流信号的差分通道宽带放大器。其最大输出电压 60Vp-p(30Vp)&#xff0c;最大输出电流1Ap&#xff08;>50Hz&#xff09;。电压增益数控可调&#xff0c;一键保存设置&#xff0c;提供了方便简洁的操作选择&#xff0c;可…...

数据结构和算法专题---4、限流算法与应用

本章我们会对限流算法做个简单介绍&#xff0c;包括常用的限流算法&#xff08;计数器、漏桶算法、令牌桶案发、滑动窗口&#xff09;的概述、实现方式、典型场景做个说明。 什么是限流算法 限流是对系统的一种保护措施。即限制流量请求的频率&#xff08;每秒处理多少个请求…...

亚信安慧AntDB受邀分享核心业务系统全域数据库替换实践

近日&#xff0c;亚信安慧AntDB数据库凭借丰富的核心业务系统升级替换能力和经验&#xff0c;受邀参与IT168组织的第三期“国产软硬件升级替换之路”的直播沙龙。 亚信安慧AntDB数据库相关负责人发表《基于AntDB的CRM全域数据库替换实践》的精彩演讲&#xff0c;通过通信行业率…...

1.uniapp基础

1.uniapp基础 官方文档&#xff1a;uni-app官网 1.1开发工具 &#xff08;1&#xff09;工具&#xff1a; HBuilderX HBuilderX-高效极客技巧 1.2 新建项目 &#xff08;1&#xff09; 文件》新建项目 ​ &#xff08;2&#xff09;选择相应的配置信息&#xff0c;填写项目根路…...

typescript中的策略模式

typescript中的策略模式 当我们需要以整洁、易于维护和易于调试的方式构建应用程序时&#xff0c;使用设计模式是一种非常好的方式。 在本文中&#xff0c;我们的目标是阐明如何将策略模式无缝地集成到我们的应用程序中。如果我们熟悉依赖性注入&#xff0c;可能会发现策略模…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

MFC内存泄露

1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

Ubuntu系统复制(U盘-电脑硬盘)

所需环境 电脑自带硬盘&#xff1a;1块 (1T) U盘1&#xff1a;Ubuntu系统引导盘&#xff08;用于“U盘2”复制到“电脑自带硬盘”&#xff09; U盘2&#xff1a;Ubuntu系统盘&#xff08;1T&#xff0c;用于被复制&#xff09; &#xff01;&#xff01;&#xff01;建议“电脑…...

微服务通信安全:深入解析mTLS的原理与实践

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、引言&#xff1a;微服务时代的通信安全挑战 随着云原生和微服务架构的普及&#xff0c;服务间的通信安全成为系统设计的核心议题。传统的单体架构中&…...

Vue.js教学第二十一章:vue实战项目二,个人博客搭建

基于 Vue 的个人博客网站搭建 摘要: 随着前端技术的不断发展,Vue 作为一种轻量级、高效的前端框架,为个人博客网站的搭建提供了极大的便利。本文详细介绍了基于 Vue 搭建个人博客网站的全过程,包括项目背景、技术选型、项目架构设计、功能模块实现、性能优化与测试等方面。…...

如何优雅地绕过限制调用海外AI-API?反向代理与API中转技术详解​

阅读时长​​ | 8分钟 ​​适用读者​​ | 需要跨境调用OpenAI等AI服务的开发者/企业 ​​一、问题背景&#xff1a;为什么需要代理&#xff1f;​​ 最近在技术社区看到这样的求助&#xff1a; "公司服务器在国内&#xff0c;但业务需要调用OpenAI接口&#xff0c;直接访…...

小白的进阶之路系列之十四----人工智能从初步到精通pytorch综合运用的讲解第七部分

通过示例学习PyTorch 本教程通过独立的示例介绍PyTorch的基本概念。 PyTorch的核心提供了两个主要特性: 一个n维张量,类似于numpy,但可以在gpu上运行 用于构建和训练神经网络的自动微分 我们将使用一个三阶多项式来拟合问题 y = s i n ( x ) y=sin(x) y=sin(x),作为我们的…...