ResponseStatusException
目录
概述:
综合实例:
继承 ResponseStatusException-自定义异常类
继承 ResponseStatusException-自定义响应头信息
继承 ResponseStatusException-定制更多异常处理逻辑
继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码
概述:
- 从 Spring 5.0 开始引入
- 特别适用于 Spring WebFlux,也可以在 Spring MVC 中使用
- 使用
ResponseStatusException
可以在代码中的任何地方抛出特定的 HTTP 状态码(比如 404 NOT FOUND 或 400 BAD REQUEST)以及一个可选的错误消息 - 这个类继承自
RuntimeException
,因而它是一个不受检异常(unchecked exception),你不需要在方法签名上声明它,也不必强制捕获它 - 其主要的目的是通过编程方式控制异常以及相应的 HTTP 状态码和错误信息的返回
ResponseStatusException
类的主构造函数如下:status
:一个HttpStatus
枚举值,表示要返回的 HTTP 状态码reason
:一个表示错误详情的String
;这个消息可能会返回给客户端,所以在设置时要注意安全性和敏感信息泄露的问题cause
:引发异常的原始Throwable
对象;这不会直接发送给客户端,通常用于日志记录目的- 有几种构造函数版本,不一定全部需要传入(
reason
)或(cause
),您可以根据实际需求使用它们
综合实例:
- 下面是一个简单的例子,展示如何在控制器方法中使用
ResponseStatusException
: - 在这个例子中,当找不到给定 ID 的 item 时,会抛出
ResponseStatusException
,并且返回状态码404 NOT FOUND
以及错误信息 “Item not found” - 由于
ResponseStatusException
是RuntimeException
的子类,Spring 框架会捕捉到这个异常,并将其转换成相应的 HTTP 响应返回给客户端 - 这个机制允许开发者以非常灵活的方式处理各种各样的异常情况
继承 ResponseStatusException-自定义异常类
- 在 Spring Boot 应用程序中,
ResponseStatusException
是一个构建好的异常类,它可以被直接使用来返回特定的 HTTP 状态代码和消息 - 你可以在方法中直接抛出它,Spring 框架将负责将异常转化为对应的 HTTP 响应
- 但是如果你有特定的需求,比如希望在你的应用程序中创建一系列具有固定状态码和自定义处理逻辑的异常,你可以继承
ResponseStatusException
- 下面是一个简单的例子,定义了一个继承自
ResponseStatusException
的自定义异常类: - 在你的 Spring Boot 应用中使用自定义异常:
- 当
CustomBadRequestException
被抛出时,Spring 框架会捕捉到这个异常,并且根据异常内的信息返回一个HttpStatus.BAD_REQUEST
(400 错误码) 的 HTTP 响应给客户端,并带有 “这里是错误信息” 作为响应体中的错误描述 - 通过这种方式,你可以定义不同的自定义异常类型,来处理你应用程序中不同的错误情况,并返回合适的 HTTP 响应
继承 ResponseStatusException-自定义响应头信息
- 在继承自
ResponseStatusException
的自定义异常类中重写getResponseHeaders()
方法可以让你添加或者定制返回给客户端的 HTTP 响应头 - 默认情况下,
ResponseStatusException
没有响应头或者只有基本的响应头 - 通过重写这个方法,你可以根据你的业务逻辑需要,添加一些特殊的响应头信息
- 例如,你可能想添加一个关于错误的链接,一个特殊的错误追踪 ID,或者控制缓存的头信息
- 下面是一个例子,演示了如何在自定义异常中重写
getResponseHeaders()
方法来添加一个自定义的响应头:
- 在控制器中抛出这个自定义的
CustomBadRequestException
将会导致 Spring 框架处理这个异常,并在最终的 HTTP 响应中包含 ‘X-Custom-Error’ 这个头信息 - 使用自定义的响应头可以提供更多的上下文信息给调用者,或者用来传达非标准的、特定于应用的消息
- 这是一个扩展标准异常处理行为并高度定制异常返回信息的强大方式
- 要注意的是,你应该谨慎添加响应头,确保它们不会暴露敏感信息或者与你的 API 设计冲突
继承 ResponseStatusException-定制更多异常处理逻辑
- 在继承
ResponseStatusException
的自定义异常类中,除了getResponseHeaders()
之外,你可能会考虑重写几个其他重要的方法来进一步定制你的异常处理逻辑:
- getMessage():
重写这个方法可以让你改变异常的错误消息
这个消息通常会被用在日志中,也可能在一些情况下返回给客户端,取决于你的错误处理配置 - getStatus():
如果你想根据异常发生的上下文动态改变 HTTP 状态码,可以重写getStatus()
方法 - getCause():
如果你的自定义异常包装了另一个异常,你可以通过getCause()
方法提供原始的异常;这对于调试和错误跟踪是非常有用的 - printStackTrace() 和 getStackTrace():
这些方法可以被用来获取和打印异常的堆栈追踪
- 通常这些方法的默认实现足够用了,但如果需要的话,你可以提供更多的信息或者定制格式
- 在实际业务情况中,我们可以重写异常类的这些方法来增强错误处理的能力,例如记录额外的调试信息、创建更为详细的错误消息等
- 让我们来创建一个更切实的业务场景来展示这一点:
- 假设我们有一个在线电商平台,当用户尝试创建订单时,如果库存不足,我们希望抛出一个自定义的异常
- 在这个自定义异常中,我们可以重写
getMessage()
方法来提供更丰富的信息,并重写printStackTrace()
和getStackTrace()
方法来添加关于库存不足的特定上下文信息
在这个示例中:
getMessage()
被重写以返回一个更为详细的错误信息printStackTrace()
被重写以打印特定的业务相关错误信息getStackTrace()
被重写以添加自定义的堆栈跟踪元素,这可能对调试有帮助,显示出是在检查库存时出现了问题getStatus()
被重写以返回一个特定的HTTP状态;请注意,通常这也可以通过在抛出异常时传递不同的HttpStatus
枚举值给构造函数来实现getMessage()
被修改以增加更多的业务信息,如最后库存同步时间
通过这样重写这些方法,我们可以提供更加具体的错误状态和信息,以便在记录日志、返回给客户端、调试等方面提供有用的上下文
继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码
- 根据库存不足时的不同情况来设置不同的状态码(比如,如果只是暂时性的库存问题使用
503 Service Unavailable
,如果是产品完全下架则使用410 Gone
) - 可以在自定义异常类中添加逻辑如下:
- 在这个示例中,
chooseHttpStatus
方法基于productDiscontinued
布尔变量的值来选择不同的HTTP状态码 - 如果产品已经停产,那么使用
410 Gone
状态码;如果仅仅是暂时的库存问题,则使用503 Service Unavailable
- 如此,异常类的构造函数中传入的参数
productDiscontinued
决定了异常应该携带的HTTP状态码
相关文章:

ResponseStatusException
目录 概述: 综合实例: 继承 ResponseStatusException-自定义异常类 继承 ResponseStatusException-自定义响应头信息 继承 ResponseStatusException-定制更多异常处理逻辑 继承 ResponseStatusException-根据异常发生的上下文动态改变 HTTP 状态码…...

第五十二回 戴宗二取公孙胜 李逵独劈罗真人-飞桨AI框架安装和使用示例
吴用说只有公孙胜可以破法术,于是宋江请戴宗和李逵去蓟州。两人听说公孙胜的师傅罗真人在九宫县二仙山讲经,于是到了二仙山,并在山下找到了公孙胜的家。 两人请公孙胜去帮助打高唐州,公孙胜说听师傅的。罗真人说出家人不管闲事&a…...

CSAPP-程序的机器级表示
文章目录 概念扫盲思想理解经典好图安全事件 概念扫盲 1.汇编代码使用文本格式,相较于汇编的二进制可读性更好 2.程序内存包括:可执行的机器代码、操作系统需要的信息、管理过程调用和返回的运行时栈、用户分配的内存块 3.链接器为函数调用找到匹配的可…...

TCP传输收发
TCP通信: TCP发端: socket connect send recv close TCP收端: socket bind listen accept send recv close 1.connect int connect(int sockfd, const struct sockaddr *addr, socklen_t ad…...

OJ习题之——圆括号编码
圆括号编码 1.题目描述2.完整代码3.图例演示 1.题目描述 题目描述 令Ss1 s2 …sn是一个规则的圆括号字符串。S以2种不同形式编码: (1)用一个整数序列Pp1 p2 … pn编码,pi代表在S中第i个右圆括号的左圆括号数量。(记为…...

Android耗电分析之Battery Historian工具使用
Battery-Historian是谷歌推出的一款专门分析Bugreport的工具,是谷歌在2015年I/O大会上推出的一款检测运行在android5.0(Lollipop)及以后版本的设备上电池的相关信息和事件的工具,是一款对于分析手机状态,历史运行情况很好的可视化分析工具。 …...

vue el-avatar 使用require提示无法找到图片
报错信息 错误代码 问题分析 vue初始化DOM树时没有挂载数据,导致无法找到模块 解决方案...

深入理解 C# 中的 Task:异步编程的利器
深入理解 C# 中的 Task:异步编程的利器 前言一、Task 的基本概念什么是 Task?为什么要使用 Task? Task 的使用方法创建 Task等待 Task 完成Task 返回结果 Task 的进阶用法Task 异常处理Task 同步执行Task 并发限制 Task 的实际应用场景并行计…...

YOLOv9电动车头盔佩戴检测,详细讲解模型训练
向AI转型的程序员都关注了这个号👇👇👇 一、YOLOv9简介 YOLOv9是YOLO系列算法的最新版本。YOLO系列算法自2015年首次提出以来,已经在目标检测领域取得了显著的进展,以其快速和准确的特点而广受欢迎。 论文地址…...

OpenStack之Nova
一 、Nova 使用OpenStack Compute来托管和管理云计算系统。 OpenStack Compute是基础架构即服务 (IaaS)系统的主要部分。 主要模块在Python中实现: 1因为认证,与OpenStack 身份认证keystone 交互。 2因为磁盘和服务器镜像…...

虽说主业搞前端,看到如此漂亮的网页UI,也是挪不开眼呀。
漂亮的网页UI能够吸引人的眼球,给人留下深刻的印象。作为前端开发人员,可以通过不断学习和掌握设计技巧和工具,提升自己的UI设计能力,为用户提供更好的视觉体验。 以下是一些提升网页UI设计能力的建议: 学习设计基础知…...

嵌入式学习第二十六天!(网络传输:TCP编程)
TCP通信: 1. TCP发端: socket -> connect -> send -> recv -> close 2. TCP收端: socket -> bind -> listen -> accept -> recv -> send -> close 3. TCP需要用到的函数: 1. co…...

【LeetCode】升级打怪之路 Day 14:二叉树的遍历
今日题目: 144. 二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历107. 二叉树的层序遍历 II199. 二叉树的右视图637. 二叉树的层平均值429. N 叉树的层序遍历515. 在每个树行中找最大值116. 填充每个节点的下一个右侧节点指针117. …...

[Unity实战]使用NavMeshAgent做玩家移动
其实除了Character Controller, Rigidbody,我们还可以使用NavMeshAgent去做。这么做的好处是能避免玩家去莫名其妙的地方(毕竟基于烘焙过的导航网格),一般常见于元宇宙应用和mmo。 根据Unity手册,NavMeshAgent 也有和…...

官网:随便搞个?那不如不搞,搞不好就给公司减分了。
官网建设确实需要认真对待,不能随便搞。一个粗制滥造的官网可能会给公司带来负面影响,降低品牌形象和用户体验。以下是一些官网建设的重要原则: 专业性:官网应该展示公司的专业性和专业知识。它应该以专业的设计、内容和功能来展示…...

Ansible 基础入门
2)Ansible 介绍 Ansible 基本概念 Ansible 是一种自动化运维工具,基于 Paramiko 开发的,并且基于模块化工作,Ansible 是一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,它是基于 Python 语言…...

讨论:5万官网是建站界的劳斯莱斯了吧,到了软件开发领域呢?
如题,所以赛道选择很重要,当然难度系数也不一样。能花5万元做官网的,凤毛麟角,如果是做软件开发,5万元顶多算个起步价,老铁们,是这样吗?...

手写分布式配置中心(三)增加实时刷新功能(短轮询)
要实现配置自动实时刷新,需要改造之前的代码。代码在https://gitee.com/summer-cat001/config-center 服务端改造 服务端增加一个版本号version,新增配置的时候为1,每次更新配置就加1。 Overridepublic long insertConfigDO(…...

【RabbitMQ】WorkQueue
📝个人主页:五敷有你 🔥系列专栏:MQ ⛺️稳中求进,晒太阳 Work Queues Work queues任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息 当消息处理比较耗时的时候&…...

国内免费好用 Chat GPT推荐
无论您是寻找技术洞见还是灵感激发,此网站是您的绝佳去处。探索着名作家的精彩观点和创意解决方案,它不仅是知识的源泉,更是思维的驱动力。在这里,您将发现无尽的学习资源和启发,助您不断前行这是一款基于OpenAi开发的…...

基于springboot实现在线考试系统项目【项目源码+论文说明】
基于springboot实现在线考试系统演示 摘要 时代在变化,科技技术以无法预测的速度在达到新的高度,并且被应用于社会生活的各个领域,随着生活的加快,也使很多潜在的点逐渐突显出来,社会对于人才的要总是非常迫切的&…...

golang中go build 后读取配置文件
golang打包后读取配置文件 在用go写代码的时候,为了好用经常使用go build 打包,如果我们用到了配置文件,就总是导致不能找到文件所在位置了出现bug,所以以下代码就解决了这个问题。 核心代码: file, err : exec.Look…...

为raspberrypi编译bpftrace调试工具
基于eBPF的嵌入式应用调试 笔者之前写过几篇有关于使用eBPF调试Linux内核和应用的博客,其中提到,在嵌入式设备上使用BCC或bpftrace是不可行的;主要原因在于嵌入式设备的资源有限,而这两个调试工具依赖python/clang/llvm等库&…...

分段线性化问题探析
目录 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 4 matlab测试结果说明 5 分段线性化应用 1 使用0-1变量将分段函数转换为线性约束 2 连续函数采用分段线性化示例 3 matlab程序测试 clc;clear all; gn10;tn1; x_pfsdpvar(1, t…...

从零学算法2917
2917.给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 nums 中的 K-or 是一个满足以下条件的非负整数: 只有在 nums 中,至少存在 k 个元素的第 i 位值为 1 ,那么 K-or 中的第 i 位的值才是 1 。 返回 nums 的 K-or 值。 注意 …...

[HackMyVM] 靶场 Wave
kali:192.168.56.104 主机发现 arp-scan -l # arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:d2:e0:49, IPv4: 192.168.56.104 Starting arp-scan 1.10.0 with 256 hosts (https://github.com/royhills/arp-scan) 192.168.56.1 0a:00:27:00:00:05 (Un…...

云渲染平台都开始涨价了?2024年性价比高的云渲染平台推荐
最近部分云渲染平台开始涨价,不论是通过调整机器性能,还是直接提价,都会对成本产生影响。这对已经习惯了平台价格的用户来说,并不是一件好事。这里举一些例子: 比如平台A,原“首小时渲染0.66元模式”已经下…...

搜索-BFS Meteor Shower S(流星雨)
Meteor Shower S(流星雨) 题目连接 题目描述 贝茜听说一场特别的流星雨即将到来:这些流星会撞向地球,并摧毁它们所撞击的任何东西。她为自己的安全感到焦虑,发誓要找到一个安全的地方(一个永远不会被流星…...

RabbitMQ实战:Springboot集成RabbitMQ并验证五种消息模型
这目录 一、添加依赖二、配置文件中添加RabbitMQ访问配置三、消息生产者代码四、消息消费者代码五、验证参考资料 一、添加依赖 <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>s…...

配置与管理防火墙
配置与管理防火墙 1,概念:设置在不同网络或网络安全域之间的一系列部件的组合。 2,功能:保护内网中易手攻击的服务;控制内外网之间网络系统的访问;隐藏内网的IP地址及结构的细节,提高网络保护…...