详细介绍:Spring 统一异常处理怎么做?

news/2025/10/8 18:17:05/文章来源:https://www.cnblogs.com/slgkaifa/p/19129940

详细介绍:Spring 统一异常处理怎么做?

1. 创建自定义异常类

自定义异常类可以帮助我们更好地描述异常的类型和原因。例如,定义一个通用的 ApiException 类:

package com.example.exception;public class ApiException extends RuntimeException {
private final int code; // 自定义异常代码
private final String message; // 异常信息public ApiException(int code, String message) {
super(message);
this.code = code;
this.message = message;
}public int getCode() {
return code;
}public String getMessage() {
return message;
}
}

2. 创建全局异常处理器

使用 @ControllerAdvice 注解定义一个全局异常处理器类,并通过 @ExceptionHandler 注解来捕获并处理特定类型的异常。

package com.example.advice;import com.example.exception.ApiException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;@ControllerAdvice
public class GlobalExceptionHandler {// 处理自定义异常
@ExceptionHandler(ApiException.class)
public ResponseEntity handleApiException(ApiException ex) {
ErrorResponse errorResponse = new ErrorResponse(ex.getCode(), ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
}// 处理其他未捕获的异常
@ExceptionHandler(Exception.class)
public ResponseEntity handleException(Exception ex) {
ErrorResponse errorResponse = new ErrorResponse(500,"Internal Server Error: " + ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.INTERNAL_SERVER_ERROR);
}
}

在上面的代码中,ErrorResponse 是一个简单的数据类,用于封装错误信息:

package com.example.advice;public class ErrorResponse {
private final int code;
private final String message;public ErrorResponse(int code, String message) {
this.code = code;
this.message = message;
}public int getCode() {
return code;
}public String getMessage() {
return message;
}
}

3. 测试异常处理

创建一个控制器类,用于测试异常处理逻辑。

package com.example.controller;import com.example.exception.ApiException;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class TestController {@GetMapping("/test-api-exception")
public String testApiException() {
throw new ApiException(400,
"This is a custom API exception");
}@GetMapping("/test-general-exception")
public String testGeneralException() {
throw new RuntimeException("This is a general exception");
}
}

4. 启动类

创建一个 Spring Boot 启动类,启动应用。

package com.example;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ExceptionHandlingApplication {
public static void main(String[] args) {
SpringApplication.run(ExceptionHandlingApplication.class, args);
}
}

5. 测试结果

启动应用后,访问以下两个接口,观察异常处理的效果:

  • 访问 /test-api-exception

    • 返回的 JSON 响应:

      {
      "code": 400,
      "message": "This is a custom API exception"
      }
    • HTTP 状态码:400

  • 访问 /test-general-exception

    • 返回的 JSON 响应:

      {
      "code": 500,
      "message": "Internal Server Error: This is a general exception"
      }
    • HTTP 状态码:500

6. 说明

  • @ControllerAdvice:用于定义全局异常处理器类,可以捕获整个应用中的异常。

  • @ExceptionHandler:用于指定处理特定类型的异常的方法。

  • ResponseEntity:用于封装响应体和 HTTP 状态码。

  • HttpStatus:用于指定 HTTP 状态码。

通过上述实现,你可以集中处理项目中的异常,避免在每个控制器中重复编写异常处理代码,同时提供统一的错误响应格式,便于前端开发和调试。

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

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

相关文章

某平台增强排序脚本

通过左下角悬浮按钮,在弹窗中展示某乎内容的赞同数降序排序结果通过左下角悬浮按钮,在弹窗中展示某乎内容的赞同数降序排序结果点击查看代码 // ==UserScript== // @name 知乎排序增强 // @namespace htt…

印度乡村AI计划:用JAN AI打造人工智能优先村庄

JAN AI计划在印度农村地区建立人工智能优先村庄,通过本地语言AI培训帮助农民诊断作物疾病、助力手工艺人线上销售,目标覆盖1万个村庄、培训1000万公民并培养10万名乡村AI创业者。印度乡村AI计划:用JAN AI打造人工智…

兼论spatial和simulink,PTX及其他

兼论spatial和simulink,PTX及其他从工匠(工程师)的角度看,并行计算的构造最直观的一种方式共享内存的构架,从计算上讲就是数据级并行,比如单指令多数据流SIMD。 这种构造可以是从应用层来看,也可以是底层的硬件实…

做门户网站需要什么条件wordpress侧边文本轮播图片

Part.1 背景 近年来&#xff0c;汽车行业蓬勃发展&#xff0c;一度出现供不应求的现象。在汽车零配件、整车大规模制造的过程中&#xff0c;为了降本增效&#xff0c;提升产品质量&#xff0c;工厂急需完成自动化升级。随着人工智能的发展&#xff0c;越来越多的生产环节引入机…

怎么做简单网站首页北京网站怎么优化

本次分享将讲述如何在Python中对多个list的对应元素求和&#xff0c;前提是每个list的长度一样。比如&#xff1a;a[1,2,3], b[2,3,4], c[3,4,5], 对a,b,c的对应元素求和&#xff0c;输出应为[6,9,12].    方法一&#xff1a;   直接求解&#xff0c;按照对应元素相加的…

# Java方法学习:动手动脑与课后实验整理

这两周学了Java方法相关内容,攒了不少练习题和实验作业,整理成博客记录一下,也方便以后复习的时候回看~ 一、动手动脑小练习自定义随机数生成器 之前一直用Math.random()或者Random类生成随机数,这次老师要求用指定…

CF2155D Batteries

给定 \(n\) 个电池,其中 \(a\) 个是有效的,但是你不知道 \(a\) 的值,每次你可以选择两个电池进行询问,可以得知他们两个是否都有效。 要求在 \(\left\lfloor\dfrac{n^2}{a}\right\rfloor\) 次询问内找出至少一对有…

网站搜索引擎优化建议学校专业群建设专题网站

到这里&#xff0c;我们需要整理一下之前学习的epoll模型&#xff0c;并根据之前的epoll模型&#xff0c;提出弊端&#xff0c;进而整理epoll反应堆模型&#xff0c;进一步深刻理解&#xff0c;这是因为epoll实在是太重要了。 复习之前的epoll的整体流程以及思路。 参考之前写…

网站怎么伪静态网站上线是前端还是后端来做

目录 1.CString数据转化为int类型数据 2.int类型转化为CString类型数据 3.MFC中CString数据类型 转换为std::string数据类型 4.MFC中std::string数据类型 转换为CString数据类型 1.CString数据转化为int类型数据 在MFC中&#xff0c;将CString类型数据转换为int类型数据&a…

电商门户网站最美情侣免费观看

Jvm垃圾回收器cms和g1区别 G1垃圾回收器&#xff08;Garbage First&#xff09;和CMS &#xff08;Concurrent Mark-Sweep&#xff09;垃圾回收器是Java虚拟机&#xff08;JVM&#xff09;&#xff09;中的两种不同的垃圾回收策略&#xff0c;它们各有优缺点。以下是两者的比较…

北流做网站网页制作工具按其制作方式可分为

1、python介绍及与其它开发语言比较&#xff1a; 相比C、Java运行慢&#xff0c;但是代码简介&#xff0c;可以减小学习成本&#xff0c;加快项目进度。跨平台&#xff0c;支持Linux和Windows。 C语言是所有高级语言的基础&#xff0c;若要研究python语言的原理&#xff0c;需要…

JAVA语法基础》动手动脑与实验问题全整理

一、枚举类型(Enum)核心问题:枚举是基本数据类型还是引用类型?验证方法:使用和equals()比较枚举值。结论:枚举是引用类型,但相同值的枚举变量指向同一个对象,因此和equals()比较结果相同。 二、变量屏蔽…

崩铁壁纸

本人(KK_SpongeBob)蒟蒻,写不出好文章,但转载请注明原文链接:https://www.cnblogs.com/OIer-QAQ/p/19129921

PotPlayer 播放器

PotPlayer 播放器 快捷键 快进(左右) 音量(上下)

国内的平面设计网站wordpress配置网络

1. 题目 我们有一个项的集合&#xff0c;其中第 i 项的值为 values[i]&#xff0c;标签为 labels[i]。 我们从这些项中选出一个子集 S&#xff0c;这样一来&#xff1a; |S| < num_wanted对于任意的标签 L&#xff0c;子集 S 中标签为 L 的项的数目总满足 < use_limit…

10.8动手动孬

代码展示了方法重载的特殊之处,具体分析如下:特殊点:存在两个名为 square 的方法,一个接收 int 类型参数,返回 int 类型;另一个接收 double 类型参数,返回 double 类型。 原理:方法重载是指在同一个类中,允许…

[迷宫寻路 Round 3] 七连击

转化题意:求将一段序列划分为8段,求所有方案的前七段的每一段gcd的和的和. 首先朴素的dp很容易想到,设\(dp(i,j)\)为将前\(i\)位划分为前\(j\)段的答案,\(g(i,j)\)为将前\(i\)位划分为前\(j\)段的方案数. 于是有 \[\b…

Flink03-学习-套接字分词流自动写入工具 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

[笔记]树论笔记+做题记录

树的性质树上任意两点间恰有一条简单路径。树上所有节点度数和为 \(O(n)\) 的。树上 \(m\) 个点两两产生的 LCA 去重后不超过 \(m-1\) 个。Proof:考虑找 LCA 的过程,两个点向上跳,重合时合并成一个点。最后剩下 \(1…

云服务器部署大数据组件

大数据集群规划hw101 hw102 hw103HDFS NameNodeDataNode DataNode SecondaryNameNodeDataNodeYARN NodeManager ResourceManagerNodeManager NodeManagerZookeeper QuorumPeerMain QuorumPeerMain QuorumPeerMainHive …