技术分享 | Spring Boot 异常处理

news2025/1/23 3:59:15

说到异常处理,我们都知道使用 try-catch 可以捕捉异常,可以 throws 抛出异常。那么在 Spring Boot 中我们如何处理异常,如何更优雅的处理异常,如何全局处理异常。是本章讨论解决的问题。

  • Java 异常类

首先让我们简单了解或重新学习下 Java 的异常机制。

Java 内部的异常类 Throwable 包括了 Exception 和 Error 两大类,所有的异常类都是 Object 对象。

Error 是不可捕捉的异常,通俗的说就是由于 Java 内部 JVM 引起的不可预见的异常, Java 虚拟机会选择终止线程。如 OutOfMemoryError ,就是 Java 虚拟机运行过程中出现内存资源错误抛出的。

Excetpion 异常是程序本身引起的,它又分为运行时异常 RuntimeException,和非运行时(编译时)IOException 等异常。如除数为零时引发的 ArrayIndexOutOfBoundException 异常就是运行时异常。非运行异常都是可查可捕捉的。Java 编译器会告诉程序他错了,错在哪里,正确的建议什么。我们可以通过 throws 配合 try-catch 来处理。

  • Java 异常处理机制

在 Java 应用程序中,异常处理机制为:抛出异常,捕捉异常。

抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含异常类型和出现异常时的程序运行时信息。运行时系统负责寻找处置异常的代码并执行。

捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(Exception Handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。

当异常处理器能处理的异常类型与方法抛出的异常类型相符时,即为合适的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。

当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着 Java 程序的终止。

  • Spring Boot 异常处理

Spring Boot 的所有异常处理都基于 java 的。

在 Spring Boot 应用程序中,通常统一处理异常的方法有 使用注解处理 RestControllerAdvice

本示例主要目的处理我们日常 Spring Boot 中的异常处理

在 Web 项目中通过 ControllerAdvice、RestControllerAdvice 实现全局异常处理

ControllerAdvice 和 RestControllerAdvice 的区别 相当于 Controller 和 RestController 的区别。

代码示例

添加配置类

  • GlobalExceptionHandler.java

import org.springframework.http.HttpStatus;import org.springframework.web.bind.annotation.*;import java.util.HashMap;import java.util.Map;@RestControllerAdvicepublic class GlobalExceptionHandler {    @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)    @ExceptionHandler({Exception.class})    public Object exceptionHandler(Exception e){        Map<String,Object> map=new HashMap<>();        map.put("status",-1);        map.put("msg",e.getLocalizedMessage());        return map;    }}

  • 配置介绍

RestControllerAdvice:全局捕获异常,异常集中处理,更好的使业务逻辑与异常处理剥离开,定义在类上

ExceptionHandler:统一处理某一类异常,声明该方法用于捕获 value 所指的类型的异常(注意:当该异常的子父类都被声明时,按照先子后父的顺序进行捕获)

ResponseStatus:将某种异常映射为 HTTP 状态码,可用在方法上,也可以用在类上(自定义运行时异常类)。

添加模拟异常接口

  • HogwartsTestUserController.java

在 HogwartsTestUserController.java 新增一个 error 接口

/** * 模拟抛出异常 * */ @GetMapping("/error") public Object err(){ throw new RuntimeException("抛出一个异常"); }

使用 Postman 进行测试

GET http://127.0.0.1:8081/api/user/users/3 正常返回

{ "id": 3, "name": "HogwartsTest2", "pwd": "HogwartsTest2"}

GET http://127.0.0.1:8081/api/user/error 抛出异常,并给出提示信息

{ "msg": "抛出一个异常", "status": -1 }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/151489.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android开发-AS学习(一)

完整项目最精简流程&#xff1a;Android <-> 接口 <-> 数据库Android开发工具&#xff1a;Android Studio项目目录信息&#xff1a;一、控件1.1 TextView基础属性描述layout_width组件的宽度layout_height组件的高度id为TextView设置一个组件idtext设置显示的文本内…

Linux 学习笔记(借鉴黑马程序员Linux课程)

Linux视频课程 简介 Linux诞生于1991年&#xff0c;由林纳斯托瓦兹在21岁时完成。此后成为最为流行的服务器操作系统之一。 Linux内核和系统发行版 由Linux系统内核和系统级应用程序两部分组成。 内核提供系统最核心的功能&#xff0c;如&#xff1a;调度CPU、调度内存、调…

【笑小枫的按步照搬系列】Redis多系统安装(Windows、Linux、Ubuntu)

笑小枫&#x1f495; 欢迎来到笑小枫的世界&#xff0c;喜欢的朋友关注一下我呦&#xff0c;大伙的支持&#xff0c;就是我坚持写下去的动力。 微信公众号&#xff1a;笑小枫 笑小枫个人博客&#xff1a;https://www.xiaoxiaofeng.com Windows 下安装 方式一&#xff1a;https…

HCL(新华三模拟器)如何连接CRT及改界面颜色

我使用的HCL版本是2.1.1官网下载连接&#xff1a;https://www.h3c.com/cn/Service/Document_Software/Software_Download/Other_Product/H3C_Cloud_Lab/Catalog/HCL/&#xff0c;一键直达下载官网这个版本可以适配virtualbox的5.2.44的版本&#xff0c;同时支持华为的ensp模拟器…

Spring Security 表单配置(一)

Spring Security 表单配置&#xff08;一&#xff09;工具版本及环境参考资源配置详细说明工具版本及环境 工具&#xff1a; IDEA 2021.3 Maven 3.8.6 JDK 8 Spring Boot 2.7.7 Spring Securiity 5.7.6 参考资源 Spring Security官网: https://docs.spring.io/spring-security…

javaEE 初阶 — 常见的锁策略

文章目录1. 乐观锁 vs 悲观锁2. 互斥锁 vs 读写锁3. 重量级锁 vs 轻量级锁4. 自旋锁 vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. synchronized 是哪种锁8. 相关面试题1. 乐观锁 vs 悲观锁 乐观锁 指的是预测锁竞争不是很激烈&#xff0c;也就是指这里做的…

排列组合两个列表中的元素 product(a,b)

【小白从小学Python、C、Java】【计算机等级考试500强双证书】【Python-数据分析】排列组合两个列表中的元素product(a,b)关于以下python代码表述错误的一项是?from itertools import producta [1,2,3]b [4,5,6]print("【显示】a",a)print("【显示】b",…

修改Keil开发环境背景(修改为黑色主题)

修改Keil开发背景&#xff08;修改为黑色主题&#xff09;引言步骤总结引言 我们平时在Keil uVision5下开发单片机/嵌入式程序的时候&#xff0c;如果始终用的是官方的主题背景&#xff0c;往往会因为背景太白了&#xff0c;而导致视疲劳。我们使用VSCode往往不会有这种困扰&a…

Python处理字符串 中文(汉字)编码示例

在实际开发中&#xff0c;发现打印Python打印经常出现乱码&#xff0c;大部分都是编码引起&#xff0c;这里只是简单说一下utf-8/ gbk/ unicode编码之间的相互转换问题&#xff1a; utf-8是Unix下的一种通用编码&#xff0c;gbk是win环境下的一种汉字编码&#xff0c;unicode是…

计算机组成原理_总线仲裁

计算机组成原理总目录总线仲裁 由于总线连接着多个设备&#xff0c;那么在同一时刻多个设备想要占用总线时&#xff0c;就会发生冲突问题 为了解决冲突问题&#xff0c;就需要规定好所有设备使用设备的优先权&#xff0c;仲裁也就是判断设备占用总线的优先权 例如设备A的任务比…

Docker--安装mysql8--方法/步骤

原文网址&#xff1a;Docker--安装mysql8--方法/步骤_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何使用docker安装mysql8。 查看mysql版本 https://hub.docker.com/_/mysql/tags 我选择8.0&#xff0c;点击右侧箭头处直接复制命令。 拉取镜像 拉取镜像的命令 docker pul…

RADIANT:一种全新的雷达图像关联网络用于3D目标检测

RADIANT&#xff1a;一种全新的雷达图像关联网络用于3D目标检测 论文地址&#xff1a;RADIANT: Radar-Image Association Network for 3D Object Detection 源码&#xff1a;https://github.com/longyunf/radiant 单位&#xff1a;密歇根大学、福特 动机 作为一种能够直接…

全景剖析阿里云容器网络数据链路(二):Terway EN

作者&#xff1a;余凯 本系列文章由余凯执笔创作&#xff0c;联合作者&#xff1a;阿里云容器服务 谢石 对本文亦有贡献 前言 近几年&#xff0c;企业基础设施云原生化的趋势越来越强烈&#xff0c;从最开始的 IaaS 化到现在的微服务化&#xff0c;客户的颗粒度精细化和可观…

使用小度音箱+Blinker控制ESP01S Relay继电器模块

一. 使用ESP01S模块&#xff0c;PIN脚定义如下&#xff1a; 管脚功能如下&#xff1a; ESP01S模块原理图&#xff1a; ESP01S模块比ESP01模块做了以下优化&#xff1a; LED灯的管脚发生变化&#xff0c;由ESP01的TXD0变成ESP01s的GPIO2引脚&#xff1b;ESP01s模块的IO0、RST、…

Java开发 - Spring MVC框架初体验

前言 上一篇Spring框架感觉写的偏向于理论知识&#xff0c;所以从这篇开始&#xff0c;转变此系列的写作思维&#xff0c;更多的将从实操的角度来讲解Spring MVC框架的使用和相关知识点&#xff0c;会尽量详细&#xff0c;但这一系列课程针对的还是有Java基础的小伙伴&#xf…

树莓派上如何安装anaconda/miniconda环境配置

目录1. 前言2. miniconda下载3. miniconda 安装4. 添加 .bashrc 配置5. Conda 更换源&#xff0c;软件更新6. 部分问题及解决方案报错一&#xff1a;报错二&#xff1a;报错三&#xff1a;7. 卸载miniconda8. 版本问题/注意事项1. 前言 在装完树莓派之后&#xff0c;当你想要使…

()智能指针一) shared_ptr

智能指针(一) 文章目录智能指针(一)shared_ptr1初始化方式make_ptr<>() 和 shared_ptr<>() 的区别shared_ptr维护引用计数需要的信息使用原始的new函数创建shared_ptr使用make_shared创建shared_ptrmake_shared实现异常安全使用make_shared的缺点make_shared 源码解…

从一个Demo说起Dubbo3

简介 2017年的9月份&#xff0c;阿里宣布重启Dubbo的开发维护&#xff0c;并且后续又将Dubbo捐献给了Apache&#xff0c;经过多年的发展已经发布到3.X版本了&#xff0c;Dubbo重启维护之后是否有值得我们期待的功能呢&#xff0c;下面就来看看吧。 Apache Dubbo 是一款微服务…

买英伟达RTX 30 系显卡送《穿越火线》大礼包,你心动了吗?

2022年下半年英伟达一口气推出了RTX 4090、4080、4070 Ti显卡&#xff0c;40系列中的4060也在准备中&#xff0c;而RTX 30 系列在新系列的光芒下显得有些暗淡。 面对40系列即将成为主流的这种情况下&#xff0c;英伟达势必要想一些办法清清30系列显卡的库存&#xff0c;于是英…

上半年要写的博客文章24

上半年要写的博客文章21 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个…