Spring Boot 异常处理:从全局捕获到优化用户体验!

全文目录:

    • 开篇语
    • **前言**
    • **1. Spring Boot 异常处理的基本概念**
    • **2. 使用 `@ExceptionHandler` 局部处理异常**
      • **示例:局部异常处理**
      • **优化建议:**
    • **3. 使用 `@ControllerAdvice` 和 `@RestControllerAdvice` 进行全局异常处理**
      • **示例:全局异常处理**
      • **优化建议:**
    • **4. 自定义异常和异常处理**
      • **示例:自定义异常类**
      • **优化建议:**
    • **5. 优化用户体验:自定义错误响应**
      • **示例:自定义错误响应类**
      • **示例:在异常处理中使用自定义错误响应**
      • **优化建议:**
    • **6. 使用 `@ResponseStatus` 定义 HTTP 状态码**
      • **示例:使用 `@ResponseStatus` 注解**
    • **7. 结论**
    • 文末

开篇语

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛

  今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。

  我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。

小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!

前言

  在开发过程中,异常是不可避免的,尤其是当应用规模越来越大时,异常的管理和处理变得尤为重要。在 Spring Boot 应用中,良好的异常处理不仅能帮助开发者快速定位和修复问题,还能有效优化用户体验。通过对异常的全局捕获和处理,能够使得系统更加健壮,并且为用户提供清晰的错误信息和友好的反馈。

  本文将介绍如何在 Spring Boot 中进行异常处理,涵盖从全局异常捕获到优化用户体验的常用实践。

1. Spring Boot 异常处理的基本概念

在 Spring Boot 中,异常处理主要有以下几种常见方式:

  • 局部异常处理:在控制器(Controller)方法内部处理特定的异常。
  • 全局异常处理:使用 @ControllerAdvice@RestControllerAdvice 注解进行全局异常捕获。
  • 自定义异常:通过创建自定义异常类和异常处理类来处理特定场景的异常。

2. 使用 @ExceptionHandler 局部处理异常

在 Spring Boot 中,你可以在单个控制器类中使用 @ExceptionHandler 注解来捕获和处理异常。这种方式适用于只需要在特定控制器中处理的异常。

示例:局部异常处理

@RestController
public class MyController {@GetMapping("/divide")public int divide(@RequestParam int a, @RequestParam int b) {return a / b;}@ExceptionHandler(ArithmeticException.class)public ResponseEntity<String> handleArithmeticException(ArithmeticException ex) {return new ResponseEntity<>("Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);}
}

在上面的示例中,当 /divide 路由处理过程中发生 ArithmeticException 异常时,handleArithmeticException 方法将会捕获这个异常并返回一个自定义的错误信息。

优化建议:

局部异常处理适用于单个控制器类,但当异常处理逻辑需要应用于多个控制器时,这种方式就显得不够灵活。因此,推荐使用全局异常处理来统一处理应用中的异常。

3. 使用 @ControllerAdvice@RestControllerAdvice 进行全局异常处理

为了简化全局异常处理,Spring 提供了 @ControllerAdvice@RestControllerAdvice 注解,用于定义全局异常处理类。@RestControllerAdvice@ControllerAdvice@ResponseBody 的结合,适用于处理 RESTful 风格的应用。

示例:全局异常处理

首先创建一个全局异常处理类,使用 @ControllerAdvice 注解:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ArithmeticException.class)public ResponseEntity<String> handleArithmeticException(ArithmeticException ex) {return new ResponseEntity<>("Global Error: " + ex.getMessage(), HttpStatus.BAD_REQUEST);}@ExceptionHandler(Exception.class)public ResponseEntity<String> handleGenericException(Exception ex) {return new ResponseEntity<>("Unexpected Error: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}

在这个例子中,GlobalExceptionHandler 捕获了全局范围内的 ArithmeticExceptionException,并返回自定义的错误信息。@ControllerAdvice 可以捕获所有控制器中的异常,因此异常处理逻辑可以集中管理。

优化建议:

全局异常处理的优势是可以统一管理和处理应用中的异常,特别是在开发大型应用时,能够减少代码重复。你可以在此类中捕获各种类型的异常,并进行适当的错误响应。

4. 自定义异常和异常处理

在一些情况下,你可能需要为应用创建自定义异常类,以便针对特定的业务场景进行处理。自定义异常类通常继承 RuntimeExceptionException

示例:自定义异常类

public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

然后,在全局异常处理类中捕获这个自定义异常:

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<String> handleResourceNotFoundException(ResourceNotFoundException ex) {return new ResponseEntity<>("Resource Not Found: " + ex.getMessage(), HttpStatus.NOT_FOUND);}
}

优化建议:

使用自定义异常能够明确区分不同类型的错误,并且可以通过返回不同的 HTTP 状态码(如 404、500 等)提供给用户更明确的信息。

5. 优化用户体验:自定义错误响应

当异常发生时,简单的错误消息往往不能提供足够的信息。为了改善用户体验,可以通过返回详细的错误响应体来帮助前端或用户更好地理解错误情况。

示例:自定义错误响应类

public class ErrorResponse {private String message;private int status;private long timestamp;public ErrorResponse(String message, int status) {this.message = message;this.status = status;this.timestamp = System.currentTimeMillis();}// Getters and setters
}

示例:在异常处理中使用自定义错误响应

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(ResourceNotFoundException.class)public ResponseEntity<ErrorResponse> handleResourceNotFoundException(ResourceNotFoundException ex) {ErrorResponse errorResponse = new ErrorResponse(ex.getMessage(), HttpStatus.NOT_FOUND.value());return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);}
}

优化建议:

通过自定义错误响应类,可以将更多信息传递给前端。例如,错误消息、状态码和时间戳等信息,这些都有助于前端开发人员调试和处理异常。确保错误信息清晰且易于理解,以改善用户体验。

6. 使用 @ResponseStatus 定义 HTTP 状态码

@ResponseStatus 注解可以直接在异常类上指定 HTTP 状态码。这样,当该异常被抛出时,Spring 会自动返回指定的状态码。

示例:使用 @ResponseStatus 注解

@ResponseStatus(value = HttpStatus.NOT_FOUND, reason = "Resource Not Found")
public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException(String message) {super(message);}
}

这样,当 ResourceNotFoundException 被抛出时,Spring 会自动返回 HTTP 状态码 404,并带有自定义的错误信息。

7. 结论

Spring Boot 的异常处理机制非常强大,通过合理使用全局异常处理、局部异常处理、自定义异常类以及自定义错误响应,可以大大提升系统的健壮性和用户体验。

  1. 局部异常处理:适用于只需要在某个控制器内处理的异常,使用 @ExceptionHandler 注解。
  2. 全局异常处理:使用 @ControllerAdvice@RestControllerAdvice 进行全局异常捕获,便于集中管理异常处理。
  3. 自定义异常:通过自定义异常类和自定义异常处理逻辑,使得异常处理更加符合业务需求。
  4. 优化用户体验:通过返回详细的错误响应,帮助用户理解问题所在,同时提供更好的错误信息。

通过这些优化,你的 Spring Boot 应用将能更好地处理异常,并提升用户体验。

… …

文末

好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。

… …

学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!

wished for you successed !!!


⭐️若喜欢我,就请关注我叭。

⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。


版权声明:本文由作者原创,转载请注明出处,谢谢支持!

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

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

相关文章

vue3.0 + TypeScript 中使用 axios 同时进行二次封装

项目背景是vite搭建的vue3.0 TypeScript 的项目&#xff0c;需要统一处理和统一维护就对axios进行了二次封装 axios的安装 npm install axios定义http文件夹然后内部定义index.ts文件&#xff0c;内部开始封装 import axios, {type AxiosInstance} from "axios";…

ESP32- 项目应用1 音乐播放器之sd的驱动配置 #1

音乐播放器 ESP32- 项目应用1 音乐播放器之sd的驱动配置 #1 文章目录 音乐播放器 1 sd卡介绍 1.1 SDCARD介绍 1.2 物理结构 1.3 协议说明 1.4 sd 卡模式 1.5 数据模式 1.6 sdio 初始化流程 1.7 SPI 模式下的 SD 卡初始化 2 原理图 2.1 sd原理图 2.2 esp32的接口 3 代码配置 3.…

Vue.js 指令系统完全指南:深入理解 v- 指令

Vue.js 的指令系统是其最强大的特性之一&#xff0c;通过以 v- 开头的特殊属性&#xff0c;我们可以在模板中声明式地绑定底层Vue实例的数据。本文将深入讲解Vue中最重要的指令&#xff0c;帮助掌握Vue的核心功能。 文章目录1. v-model&#xff1a;双向数据绑定的核心基本用法修…

计算机分类汇总大全

前端部分有 Node.js、ActionScript、Swift、TypeScript、Webpack、JavaScript。需要分别详细说明它们的定义、特点、应用场景、优缺点等。比如 Node.js&#xff0c;要提到它的运行环境、事件驱动、非阻塞 I/O&#xff0c;适合的应用如 API 服务、实时应用&#xff0c;以及常用框…

模拟链路滤波器设计一些细节

目录 原设计思路剖析 300M带宽仿真与计算 原设计思路剖析 滤波器设计的一些细节,以下为ADS54J60模拟链路的一些问题设计原理图 实际电路设计如上所示,但是实际bom并未按此设计,根据实际的BOM明细以及ADC使用说明书,可以间接理解原设计者的设计初衷,是将ADC的一部分特性…

CatBoost 完整解析:类别特征友好的梯度提升框架

1️⃣ 什么是 CatBoost&#xff1f;CatBoost&#xff08;Categorial Boosting&#xff09;是由 Yandex&#xff08;俄罗斯搜索引擎公司&#xff09;开源的梯度提升框架&#xff0c;专为类别特征处理优化。核心特点&#xff1a;无需手动 one-hot / LabelEncoding&#xff0c;原生…

NDBmysql-cluster集群部署脚本

NDB(Network Database)是MySQL Cluster的核心存储引擎,专为高可用性、高吞吐量、分布式数据存储设计,采用内存计算+磁盘持久化架构,支持跨节点数据分片与自动冗余,适用于对实时性和可靠性要求严苛的业务场景(如金融交易、电信计费、实时分析等)。 今天大白鼠就分享构建…

计算机网络中的socket是什么?编程语言中的socket编程又是什么?python的socket编程又该如何用?

1. 计算机网络中的 Socket 是什么&#xff1f; 想象一下电话系统&#xff1a; 电话插座 (Socket)&#xff1a; 是墙上的一个物理接口&#xff0c;它本身不是通话&#xff0c;但它是建立通话连接的端点。你需要把电话线插进插座才能打电话。通话 (Connection)&#xff1a; 是两台…

【科普】进程与线程的区别

一、定义与概念&#xff1a;进程&#xff1a;进程是执行中的一段程序。一旦程序被载入到内存中并准备执行&#xff0c;就变成了一个进程。进程是表示资源分配的基本概念&#xff0c;又是调度运行的基本单位&#xff0c;是系统中的并发执行的单位。线程&#xff1a;线程是进程中…

Conda创建虚拟环境,解决不同项目的冲突!

随着需求的增多&#xff0c;又要增加多几个不同的项目来在本地测试&#xff0c;这个时候往往就会遇到 不同项目的Python版本不同等等一系列问题&#xff0c;只好请出Conda来帮忙。 一、先去下载安装一下Conda Conda | Anaconda.org 安装完后&#xff0c;需要给CONDA做个环境变…

RK3568下的进程间广播通信:用C语言构建简单的中心服务器

最近的项目中需要实现这样一个功能,就是一个进程A发消息,进程B和进程C都能收到相同的消息,同样,进程B发消息,进程A和进程C也都能收到消息,就像下图中的描述。 使用一个中心服务器作为消息转发枢纽,所有客户端连接到服务器,发送消息到服务器后,服务器再将消息转发给所有…

激光雷达/相机一体机 时间同步和空间标定(1)

一、参考链接 海康威视、LIVOX与PTP时间同步_海康相机ptp同步-CSDN博客 基于PTP实现主机与相机系统时钟同步功能_ptp同步-CSDN博客

嵌入式系统的中断控制器(NVIC)

1. NVIC的核心功能 核心价值&#xff1a;NVIC通过硬件级中断管理、自动状态处理及低延迟优化&#xff0c;为实时系统提供确定性响应&#xff0c;是Cortex-M芯片实时性的基石。 中断优先级管理 支持多级可编程优先级&#xff08;通常4-8位&#xff0c;如STM32用4位实现16级优先级…

【源力觉醒 创作者计划】2025年国产AI模型深度测评:文心大模型4.5、DeepSeek、Qwen3能力大比拼

文章目录引言&#xff1a;AI大模型的新时代一、模型架构与技术生态对比1. 文心大模型4.5系列2. DeepSeek3. 通义千问&#xff08;Qwen 3.0&#xff09;二、语言理解能力实测2.1 情感分析测试2.1.1 文心一言的表现2.1.2 DeepSeek的表现2.1.3 Qwen 3.0的表现2.1.4 测试结果分析2.…

从C++0基础到C++入门(第十五节:switch语句)

一. switch语句1.1 语法结构如下&#xff1a;switch (表达式) {case 常量1:// 代码块1break;case 常量2:// 代码块2break;default:// 默认代码块 }1.2 注意 &#xff1a;表达式必须是整型或枚举类型&#xff08;如int、char&#xff09;。case后的常量必须与表达式类型兼容。学…

编程与数学 03-002 计算机网络 16_网络编程基础

编程与数学 03-002 计算机网络 16_网络编程基础一、网络编程的基本概念&#xff08;一&#xff09;客户端与服务器模型&#xff08;二&#xff09;套接字&#xff08;Socket&#xff09;编程的基本原理二、基于TCP的网络编程&#xff08;一&#xff09;TCP套接字的创建与使用&a…

在纯servlet项目中,使用@WebFilter定义了多个filter,如何设置filter的优先级

在纯 Servlet 项目中&#xff0c;WebFilter 注解本身并不提供直接的属性来设置过滤器的优先级&#xff08;如过滤器执行的顺序&#xff09;。但是&#xff0c;你可以通过以下几种方式来控制过滤器的执行顺序&#xff1a;1. 通过 web.xml 配置过滤器的顺序在 web.xml 中&#xf…

关于鸦片战争的历史

19世纪&#xff0c;英国东印度公司获得了鸦片贸易的垄断权&#xff0c;而犹太人是东印度公司的主要投资人之一&#xff0c;英国东印度公司又将鸦片经营权外包给了犹太人。其中&#xff0c;塞法迪犹太人控制了主要的鸦片交易&#xff0c;著名的沙逊家族就是当时臭名昭著的犹太鸦…

Maven - 并行安全无重复打包构建原理揭秘

作者&#xff1a;唐叔在学习 专栏&#xff1a;唐叔的Java实践 标签&#xff1a; #Maven并行构建 #Maven多线程打包 #Java构建优化 #Maven性能调优 #CI/CD加速 #Maven反应堆原理 #避免重复编译 #高并发构建 文章目录一、遇到问题&#xff1a;并行打包会不会翻车&#xff1f;二、…

phpyun人才系统v7.1使用升级补丁怎么从授权版升级至vip版?我说下我的技巧有资源的可以看过来,这样就不用花钱麻烦官方了,新版本照样支持小程序源码

前:这个方法我只在Phpyun 的7.x系列使用过&#xff0c;低于这个版本的我暂时没有研究过&#xff0c;我感觉大同小异&#xff01; 一. 升级前提条件 无论现在你使用的是商业版还是学习版 想垮系列升级你必须有对应的升级补丁&#xff0c;比如说你是授权版或旗舰版 想升级到最新的…