【SpringBoot】24 核心功能 - Web开发原理 -Spring Boot 异常处理机制

前言

在开发 Web 应用程序时,异常处理是一个至关重要的部分。Spring Boot 提供了一套强大的异常处理机制,使得开发者能够轻松地处理和响应各种异常情况。本文将深入探讨 Spring Boot 中的异常处理机制,包括默认的错误处理规则、定制错误处理逻辑以及异常处理的自动配置原理。

一、默认错误处理规则

在默认情况下,Spring Boot 提供了 /error 路径来处理所有错误的映射。当应用程序发生异常时,Spring Boot 会自动将请求路由到这个默认的错误处理路径。

对于机器客户端(如 API 调用),Spring Boot 会生成一个 JSON 响应,其中包含错误的状态码(HTTP 状态)和异常消息的详细信息。以下是一个示例 JSON 响应:

{"timestamp": "2024-07-19T08:22:25.669+00:00","status": 404,"error": "Not Found","message": "No message available","path": "/asadada"
}

对于浏览器客户端,Spring Boot 会响应一个“whitelabel”错误视图,以 HTML 格式呈现相同的数据。这个默认的错误页面虽然简单,但能提供基本的错误信息。

二、定制错误处理逻辑

1. 自定义错误页

我们可以创建自定义的错误页面来替换默认的“whitelabel”错误视图。例如,创建 error/404.htmlerror/5xx.html 文件,Spring Boot 会根据不同的 HTTP 状态码自动选择对应的错误页面进行渲染。

2. 使用 @ControllerAdvice@ExceptionHandler

通过实现 ErrorController 并注册该类型的 Bean 定义,或者添加 ErrorAttributes 类型的组件,我们可以完全替换默认的错误处理行为。更常见和灵活的方式是使用 @ControllerAdvice@ExceptionHandler 注解。

以下是一个示例代码:

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.context.request.WebRequest;@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<Object> handleAllExceptions(Exception ex, WebRequest request) {// 可以在这里记录异常日志String errorMessage = "An unexpected error occurred: " + ex.getMessage();return new ResponseEntity<>(errorMessage, HttpStatus.INTERNAL_SERVER_ERROR);}@ExceptionHandler(NotFoundException.class)public ResponseEntity<Object> handleNotFoundException(NotFoundException ex, WebRequest request) {String errorMessage = "Resource not found: " + ex.getMessage();return new ResponseEntity<>(errorMessage, HttpStatus.NOT_FOUND);}
}

在上述代码中,@ControllerAdvice 注解表示这是一个全局的异常处理器。@ExceptionHandler 注解用于指定处理特定类型异常的方法。当发生 Exception 类型的异常时,handleAllExceptions 方法会被调用;当发生 NotFoundException 类型的异常时,handleNotFoundException 方法会被调用。

3. 实现 HandlerExceptionResolver

我们还可以通过实现 HandlerExceptionResolver 接口来自定义异常处理逻辑。这个接口定义了一个 resolveException 方法,我们可以在这个方法中处理异常并返回一个 ModelAndView 对象。

以下是一个简单的示例:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ModelAndView;public class CustomHandlerExceptionResolver implements HandlerExceptionResolver {@Overridepublic ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {// 处理异常逻辑ModelAndView modelAndView = new ModelAndView("error/500");modelAndView.addObject("errorMessage", ex.getMessage());return modelAndView;}
}

三、异常处理自动配置原理

Spring Boot 通过 ErrorMvcAutoConfiguration 类自动配置异常处理规则。在这个配置类中,定义了多个组件:

  1. DefaultErrorAttributes:实现了 ErrorAttributesHandlerExceptionResolver 接口,用于收集和提供错误属性信息。
  2. BasicErrorController:处理 /error 路径的请求,根据请求的类型(HTML 或 JSON)返回相应的错误响应。
  3. BeanNameViewResolver:视图解析器,按照返回的视图名作为组件的 id 去容器中找视图对象。
  4. DefaultErrorViewResolver:如果发生错误,会以 HTTP 的状态码作为视图页地址(viewName),找到真正的页面。

以下是 ErrorMvcAutoConfiguration 类中部分组件的定义示例:

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "server.error.whitelabel", name = "enabled", matchIfMissing = true)
@ConditionalOnClass(EmbeddedWebApplication.class)
public class ErrorMvcAutoConfiguration {// 定义 DefaultErrorAttributes@Bean@ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)public DefaultErrorAttributes errorAttributes() {return new DefaultErrorAttributes();}// 定义 BasicErrorController@Bean@ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)public BasicErrorController basicErrorController(ErrorAttributes errorAttributes, ObjectProvider<ErrorViewResolver> errorViewResolvers) {return new BasicErrorController(errorAttributes, errorViewResolvers.orderedStream().collect(Collectors.toList()));}// 其他组件定义...
}

四、异常处理步骤流程

  1. 执行目标方法:当目标方法运行期间发生任何异常时,会被 catch,并且标志当前请求结束,使用 dispatchException 进入视图解析流程(页面渲染?)。
  2. 调用 processDispatchResult 方法:该方法处理派发结果,包括处理异常。
  3. 处理 HandlerException:遍历所有的 handlerExceptionResolvers,看谁能处理当前异常。

系统默认的异常解析器包括 DefaultErrorAttributesHandlerExceptionResolverComposite 等。DefaultErrorAttributes 先来处理异常,把异常信息保存到 request 域,并且返回 null。如果没有任何人能处理异常,异常会被抛出,最终由底层的 BasicErrorController 处理,解析错误视图。

总结

Spring Boot 的异常处理机制提供了灵活且强大的方式来处理应用程序中的各种异常情况。通过默认的错误处理规则、定制错误处理逻辑以及理解异常处理的自动配置原理,我们可以更好地构建健壮的 Web 应用程序。在实际开发中,根据具体的需求选择合适的异常处理方式,能够提高应用程序的稳定性和用户体验。

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

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

相关文章

JVM第一部分

PC寄存器&#xff1a;存储的是数字 0, 3, 6, 10, 17 这样的字节码偏移量。 LineNumberTable&#xff1a;是一个映射表&#xff0c;它将上述的偏移量“翻译”成我们程序员能看懂的源代码行号。 JVM堆 JVM堆由两部分组成&#xff1a;年轻代老年代 年轻代包括三部分&#xff1a;ed…

IDEA使用Maven和MyBatis简化数据库连接(配置篇)

目录&#xff1a; Maven:简化项目构建 MyBatis:简化Jdbc Maven&#xff1a;是一款项目构建与依赖管理工具&#xff0c;核心作用是自动化项目编译、打包等流程&#xff0c;并统一管理项目所需的第三方 Jar 包&#xff08;如 MyBatis 的 Jar 包&#xff09;。 MyBatis&#xf…

Java 泛型详解:从基础到高级应用

目录 一、泛型的基本概念 为什么需要泛型&#xff1f; 二、泛型类与泛型接口 【1】定义泛型类 【2】定义泛型接口 三、泛型方法 四、泛型通配符 【1】无界通配符&#xff08;?&#xff09; 【2】上界通配符&#xff08;? extends T&#xff09; 【3】下界通配符&am…

嵌入式 Linux 启动机制全解析:从 Boot 到 Rootfs

&#x1f680; 嵌入式 Linux 启动机制全解析&#xff1a;从 Boot 到 Rootfs 在嵌入式系统中&#xff0c;Linux 的启动流程不仅是内核加载的过程&#xff0c;更是 bootloader、设备树、初始根文件系统、启动配置文件等多个组件协同工作的结果。不同的文件系统和启动方式会影响系…

Python 操作Office的PPT、Word、Excel,同时兼容WPS

文章目录概要一、环境准备1. 安装必要的Python库2. 系统要求二、核心实现原理1. 检测已安装的Office类型2. 初始化对应的应用程序三、完整代码实现四、使用示例五、WPS兼容处理详解1. 形状和文本框访问兼容处理2. PPT图片粘贴兼容处理3. 资源释放的重要性六、图片操作实现详解1…

ISP之DHCPv6-PD(前缀代理)为用户下发前缀

一、组网需求家庭用户要使用IPv6地址接入互联网。为方便用户接入&#xff0c;运营商使用DHCPv6-PD的方式给家用路由器下发IPv6地址前缀&#xff0c;用户路由器LAN侧不需要手工指定链路的IPv6地址前缀&#xff0c;家用路由器可以给用户终端自动配置IPv6地址和其它网络参数。本例…

Django全栈班v1.04 Python基础语法 20250912 上午

rm 删除命令 注意&#xff1a;删除操作是不可逆的&#xff0c;一旦删除就无法撤销&#xff0c;请谨慎使用。删除文件&#xff1a; rm file.py递归删除目录&#xff1a; rm -r demo/强制删除&#xff1a; rm -f file.py交互式删除&#xff1a; rm -i *.txt课程定位 “学习Python…

Java 21 虚拟线程高并发落地:中间件适配、场景匹配与细节优化的技术实践

作为 Java 21 的核心特性,虚拟线程(Virtual Thread)凭借 “用户态调度”“轻量级资源占用” 的优势,成为高并发场景下线程模型优化的重要方向。但在实际落地中,不少团队会陷入 “技术用了却没效果” 的困境 ——QPS 提升有限、中间件调用阻塞、CPU 使用率异常升高。 本文…

数据库在并发访问时,不同隔离级别下脏读幻读问题

数据库隔离级别并非安装后就固定&#xff0c;绝大多数主流数据库&#xff08;如MySQL、PostgreSQL、SQL Server&#xff09;都支持动态调整和运行中自定义&#xff0c;具体调整范围可分为全局、会话和语句三个层级。 全局级别调整&#xff1a;修改数据库配置文件&#xff08;如…

JVM从入门到实战:从字节码组成、类生命周期到双亲委派及打破双亲委派机制

摘要&#xff1a;本文围绕 Java 字节码与类加载机制展开&#xff0c;详解字节码文件组成、类的生命周期&#xff0c;介绍类加载器分类、双亲委派机制及打破该机制的方式&#xff0c;还阐述了线程上下文类加载器与 SPI 机制在 JDBC 驱动加载中的应用&#xff0c;帮助深入理解 Ja…

多源最短路(Floyd算法

多源最短路简介 多源最短路算法用于解决图中任意两节点间最短路径的问题&#xff0c;广泛应用于交通网络、社交关系分析、路由优化等场景。与单源最短路&#xff08;如Dijkstra&#xff09;不同&#xff0c;它一次性计算所有节点对的最短距离&#xff0c;适合需要全局路径规划的…

【攻防实战】记一次攻防实战全流程

那天我向众神祈祷&#xff0c;最后回答我的却只有挣扎十年依旧不甘的自己&#xff01;成功究竟是馈赠还是偿还。 前言 网络安全技术学习&#xff0c;承认⾃⼰的弱点不是丑事&#xff0c;只有对原理了然于⼼&#xff0c;才能突破更多的限制。 拥有快速学习能力的安全研究员&…

Anaconda配置环境变量和镜像

Anaconda配置环境变量和镜像 下载失败就是开了梯子 Anaconda 作用&#xff1a;包管理&#xff08;集中&#xff0c;有序&#xff09;和环境管理&#xff08;版本切换&#xff09;使用conda命令对虚拟环境创建、删除自带python解释器pip&#xff08;python自带的包管理工具&…

给定单词倒排

实现代码&#xff1a;public static void main(String[] args) {Scanner scanner new Scanner(System.in);// 输入的字符串String input scanner.nextLine();// 存储单词List<String> words new ArrayList<>();// 存储当前单词StringBuilder currentWord new S…

IO进程——进程引入、进程函数接口

一、引入1、进程&程序1.1 程序编译好的可执行的文件存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09;程序是静态的&#xff0c;没有任何执行的概念1.2 进程一个独立的可调度的任务执行一个程序所分配的资源的总称进程是程序执行的一次过程进程是动态的&…

周末游戏推荐:安卓端俄罗斯方块,经典与创新的结合

前段时间&#xff0c;每到周末我都会给大家推荐一些离线的经典游戏&#xff0c;原本打算将这个传统一直延续下去。然而&#xff0c;我实在找不到足够好用且无广告的游戏了。有些游戏刚开始用的时候还不错&#xff0c;但用着用着就开始频繁弹出广告&#xff0c;这让我实在不敢向…

《用 Scikit-learn 构建 SVM 分类模型:从原理到实战的全流程解析》

《用 Scikit-learn 构建 SVM 分类模型:从原理到实战的全流程解析》 一、引言:为什么选择 SVM? 在机器学习的众多算法中,支持向量机(SVM)以其强大的分类能力和良好的泛化性能,在文本分类、人脸识别、医学诊断等领域广泛应用。尤其在中小规模数据集上,SVM 往往能提供比…

一文学会CMakeLists.txt: CMake现代C++跨平台工程化实战

你能学到什么&#xff1f;朋友们好久不见&#xff0c;我是alibli&#xff0c;好久没有更新博客了。今天本人将通过构造一个实际的虚拟小项目&#xff0c;来让你彻底掌握CMake跨平台工程构建&#xff0c;学会CMakeLists.txt语法。该项目实现了一个简单的平方、立方的计算程序&am…

高并发场景下限流算法实践与性能优化指南

高并发场景下限流算法实践与性能优化指南 在大规模并发访问环境中&#xff0c;合理的限流策略能保护后端服务稳定运行&#xff0c;避免系统因瞬时高并发导致资源耗尽或崩溃。本文将从原理出发&#xff0c;深入解析几种主流限流算法&#xff0c;并结合Java和Redis给出完整可运行…

Vue3应用执行流程详解

精确化的完整执行流程 (以 Vite Vue3 SPA 为例)整个过程可以分为两部分&#xff1a;首次访问的“冷启动”和后续的Vue应用接管。第一部分&#xff1a;首次访问与页面加载客户端&#xff1a;发送请求用户打开浏览器&#xff0c;输入 URL&#xff08;如 http://localhost:5173&a…