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

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()之外,你可能会考虑重写几个其他重要的方法来进一步定制你的异常处理逻辑:
  1. getMessage():
    重写这个方法可以让你改变异常的错误消息
    这个消息通常会被用在日志中,也可能在一些情况下返回给客户端,取决于你的错误处理配置
  2. getStatus():
    如果你想根据异常发生的上下文动态改变 HTTP 状态码,可以重写 getStatus() 方法
  3. getCause():
    如果你的自定义异常包装了另一个异常,你可以通过 getCause() 方法提供原始的异常;这对于调试和错误跟踪是非常有用的
  4. 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年首次提出以来,已经在目标检测领域取得了显著的进展,以其快速和准确的特点而广受欢迎。 论文地址&#xf…...

OpenStack之Nova

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

虽说主业搞前端,看到如此漂亮的网页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 语言&#xf…...

讨论: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开发的…...

C++初阶-list的底层

目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...