【Spring Boot 异常处理】

文章目录

  • 一、Spring Boot 中的异常处理概述
    • 1. 异常处理的重要性
    • 2. Spring Boot的默认异常处理机制
  • 二、自定义异常处理
    • 1. 创建自定义异常类
      • 示例代码
    • 2. 使用`@ExceptionHandler`注解
      • 示例代码
    • 3. `@ControllerAdvice`的使用
      • 示例代码
  • 三、进阶异常处理
    • 1. 异常处理与REST API
      • 使用`@RestControllerAdvice`
    • 2. 使用`ResponseEntityExceptionHandler`
      • 扩展`ResponseEntityExceptionHandler`
    • 3. 异常与日志管理
      • 集成日志管理

一、Spring Boot 中的异常处理概述

1. 异常处理的重要性

良好的异常处理机制不仅关乎应用程序的稳定性和安全性,还直接影响到用户体验:

  • 提高应用稳定性:有效的异常处理可以防止应用程序因未预料的错误而崩溃,确保应用即使在异常情况下也能继续运行,或至少能够优雅地失败,从而提高整体的应用稳定性。
  • 增强用户体验:通过友好的错误提示和异常反馈,用户可以了解操作失败的原因,甚至得到如何解决问题的指引,很大程度上增强了用户体验。
  • 便于问题定位和调试:合理的异常处理和记录机制能够帮助开发者快速定位问题根源,简化调试和修复过程,提高开发效率。

2. Spring Boot的默认异常处理机制

  • 内置异常处理器:Spring Boot内部集成了BasicErrorController,自动处理所有的HTTP错误映射。对于常见的HTTP错误,比如404(资源未找到)或500(服务器内部错误),Spring Boot会自动映射到相应的错误页面。
  • 默认错误页面:当发生异常时,如果是Web应用,Spring Boot会默认提供一个简单的错误页面,显示异常的状态码和简要信息。这提供了一个基本的用户反馈机制,避免了用户面对白屏或不友好的错误提示。
  • 可定制性:虽然Spring Boot提供了默认的异常处理机制,但它也允许开发者通过简单的配置或添加自定义代码来覆盖默认行为,比如自定义错误页面、错误信息的格式化输出等。

二、自定义异常处理

虽然Spring Boot提供了默认的异常处理机制,但在很多情况下,还是需要根据应用程序的特定需求来自定义这些行为。

1. 创建自定义异常类

示例代码

public class CustomException extends RuntimeException {public CustomException(String message) {super(message);}// 其他构造函数和方法可以根据需要添加,例如,错误代码或者错误详细信息等
}

通过继承RuntimeException或其他标准Java异常类,我们可以创建具有特定错误信息或状态的异常类。这样的设计使得异常的抛出和处理更为灵活和清晰。

2. 使用@ExceptionHandler注解

@ExceptionHandler注解允许我们处理由控制器(Controller)抛出的特定类型的异常。通过定义异常处理方法,并将其与异常类关联,我们可以定制异常的处理逻辑,包括返回错误信息和状态码。

示例代码

@ControllerAdvice
public class CustomExceptionHandler {@ExceptionHandler(CustomException.class)public ResponseEntity<Object> handleCustomException(CustomException ex) {// 创建一个适合的响应实体,包含错误信息和适当的HTTP状态码Map<String, Object> body = new LinkedHashMap<>();body.put("timestamp", LocalDateTime.now());body.put("message", ex.getMessage());return new ResponseEntity<>(body, HttpStatus.BAD_REQUEST);}
}

3. @ControllerAdvice的使用

@ControllerAdvice注解用于定义全局异常处理器,它能够捕获并处理所有控制器中抛出的异常。通过与@ExceptionHandler结合使用,我们可以在一个地方集中管理和处理应用程序中的所有异常。

示例代码

@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<Object> handleGlobalException(Exception ex, WebRequest request) {Map<String, Object> body = new LinkedHashMap<>();body.put("timestamp", LocalDateTime.now());body.put("message", "An unexpected error occurred");return new ResponseEntity<>(body, HttpStatus.INTERNAL_SERVER_ERROR);}// 可以添加更多的异常处理方法来处理不同类型的异常
}

三、进阶异常处理

1. 异常处理与REST API

@RestControllerAdvice结合了@ControllerAdvice@ResponseBody,提供了一个跨所有@RestController的异常处理方案。

使用@RestControllerAdvice

@RestControllerAdvice
public class RestExceptionHandler {@ExceptionHandler(CustomException.class)public ResponseEntity<?> handleCustomException(CustomException ex) {ApiError error = new ApiError(HttpStatus.BAD_REQUEST, ex.getMessage());return new ResponseEntity<>(error, error.getStatus());}// 其他异常处理方法
}

这种方法使得处理异常时自动将异常信息序列化为JSON或其他响应体格式,从而为客户端提供了一致和标准化的错误响应结构。

2. 使用ResponseEntityExceptionHandler

ResponseEntityExceptionHandler用于处理Spring MVC抛出的所有异常。通过扩展这个类,并覆盖其中的方法,我们可以自定义异常的处理逻辑,包括自定义HTTP响应的状态码和错误信息。

扩展ResponseEntityExceptionHandler

@ControllerAdvice
public class RestResponseEntityExceptionHandler extends ResponseEntityExceptionHandler {@Overrideprotected ResponseEntity<Object> handleMethodArgumentNotValid(MethodArgumentNotValidException ex, HttpHeaders headers, HttpStatus status, WebRequest request) {List<String> errors = new ArrayList<>();for (FieldError error : ex.getBindingResult().getFieldErrors()) {errors.add(error.getField() + ": " + error.getDefaultMessage());}ApiError apiError = new ApiError(HttpStatus.BAD_REQUEST, "Validation failed", errors);return handleExceptionInternal(ex, apiError, headers, apiError.getStatus(), request);}// 其他重写方法
}

这个方法特别适用于处理各种Spring MVC层面的异常,如表单验证失败(MethodArgumentNotValidException)等。

3. 异常与日志管理

合理的异常日志记录对于定位和分析生产环境中的问题至关重要。通过结合日志管理工具(如SLF4J、Logback或Log4j2),可以记录关键的异常信息,包括异常类型、消息、堆栈跟踪和发生时间等。

集成日志管理

@ControllerAdvice
public class GlobalExceptionHandler {private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value = { Exception.class })public ResponseEntity<Object> handleAnyException(Exception ex, WebRequest request) {logger.error("Unhandled exception caught: ", ex);ApiError apiError = new ApiError(HttpStatus.INTERNAL_SERVER_ERROR, ex.getLocalizedMessage(), "error occurred");return new ResponseEntity<>(apiError, new HttpHeaders(), apiError.getStatus());}
}

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

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

相关文章

vue中v-if与v-show的区别

在 Vue.js 中&#xff0c;v-if 和 v-show 都是用来控制元素显示与隐藏的指令&#xff0c;但它们之间有几个关键的区别&#xff1a; 直接上图 一. 条件渲染方式不同 v-if&#xff1a; 真正的条件渲染&#xff1a;v-if 指令会根据表达式的真假来销毁或重新创建 DOM 元素及其…

立体视差算法的研究

实时立体匹配模型 antabangun/coex (github.com) 立体视差数据集网站包含最新高分算法排行榜 antabangun/coex (github.com)

LeetCode 88.合并两个有序数组 C写法

LeetCode 88.合并两个有序数组 C写法 思路&#xff1a; ​ 由题nums1的长度为mn&#xff0c;则我们不需要开辟新的数组去存储元素。题目要求要有序合并&#xff0c;于是可以判断哪边数更大&#xff0c;将更大的数尾插在nums1中。 ​ 定义三个变量来控制下标&#xff0c;end1控…

AI绘画工具Stable Diffusion神级插件InstantID,AI换脸完美版!

随着AI绘画技术的不断迭代&#xff0c;AI换脸也日臻完美。 从路线上看&#xff0c;主要有两条路线&#xff0c;一是一张图换脸&#xff0c;优点是操作简便&#xff0c;缺点是换个姿势的时候&#xff0c;往往不太像&#xff0c;roop等插件是基于这个思路&#xff1b;二是炼制专…

第7章 Vite的测试和调试

测试和调试是软件开发过程中的重要环节。通过合理的测试策略和调试技巧&#xff0c;可以大幅提高代码的质量和稳定性。本章将介绍如何在 Vite 项目中进行单元测试、集成测试和端到端测试&#xff0c;以及常用的调试方法和工具。 1 单元测试 单元测试是对最小可测试单元进行验证…

UWB:FiRa Consortium UCI Generic Technical Specification v1.1.0(1)- UCI架构和通用数据包头

FiRa fine ranging 精确测距 为了UWB产业能够蓬勃发展&#xff0c;各个公司的产品必须互联互通&#xff0c;不然就是一盘散沙&#xff0c;成不了气候。于是成立了FiRa UWB联盟&#xff0c;相当于WiFi里面的WiFi alliance&#xff08;WiFi联盟&#xff09;&#xff0c;蓝牙里面…

uniapp x — 跨平台应用开发的强大助力

摘要&#xff1a; 随着前端技术的不断演进&#xff0c;跨平台应用开发框架成为了提升开发效率、降低开发成本的重要工具。uni-app以其跨平台兼容性和丰富的功能受到了开发者的广泛青睐。然而&#xff0c;随着应用需求的日益增长&#xff0c;对框架的功能和性能要求也在不断提高…

洛谷P1498 南蛮图腾[递归好题]

南蛮图腾 题目背景 自从到了南蛮之地&#xff0c;孔明不仅把孟获收拾的服服帖帖&#xff0c;而且还发现了不少少数民族的智慧&#xff0c;他发现少数民族的图腾往往有着一种分形的效果&#xff0c;在得到了酋长的传授后&#xff0c;孔明掌握了不少绘图技术&#xff0c;但唯独…

【Android】kotlin jdk版本冲突与Kotlin依赖管理插件

1、androidx.activity&#xff1a;activity&#xff1a;1.8.0 依赖版本错误问题 *依赖项“androidx.activity&#xff1a;activity&#xff1a;1.8.0”要求依赖它的库和应用针对版本 34 或更高版本 Android API 进行编译。&#xff1a;app 目前是针对 android-33 编译的。此外…

短视频带货的新趋势:揭秘萤瓴优选智能分镜功能的轻资产另类新风口

随着互联网的飞速发展&#xff0c;短视频平台如雨后春笋般崛起&#xff0c;短视频带货已成为电商领域的新宠。在这个趋势下,萤瓴优选凭借其独特的智能分镜功能&#xff0c;引领了一股轻资产另类新风口&#xff0c;为众多电商从业者带来了新的机遇。本文将深入探讨短视频带货的新…

解决:Failed to load PostCSS config: Failed to load PostCSS config

报错信息: [Failed to load PostCSS config: Failed to load PostCSS config (searchPath: D:/project/vite-vue-project): [Error] Must use import to load ES Module: D:\project\vite-vue-project\postcss.config.ts require() of ES modules is not supported. require(…

【Spring】springSecurity中WebSecurityConfigurerAdapter类中configure方法(5版本以下)

1、简介 在Spring Security中&#xff0c;WebSecurityConfigurerAdapter 类是一个配置适配器&#xff0c;它提供了多种 configure 方法的重载&#xff0c;允许开发者以声明性的方式配置Web安全。 2、相关规则 1. configure(WebSecurity web) 此方法用于配置哪些请求应该被Sp…

10个JavaScript One-Liners让初学者看起来很专业

原文链接&#xff1a;https://pinjarirehan.medium.com/10-javascript-one-liners-for-beginner-developers-to-look-pro-b9548353330a 原文作者&#xff1a;Rehan Pinjari 翻译&#xff1a;小圆 你是不是在辛苦码字时&#xff0c;看到别人轻松甩出一行 JavaScript 就搞定难题…

量化机器人对投资策略的调整

量化机器人在现代投资管理中扮演着越来越重要的角色&#xff0c;尤其在调整和优化投资策略方面表现出其独特的价值。通过运用先进的算法、人工智能和大数据分析&#xff0c;这些机器人能够实现投资策略的高度自动化调整&#xff0c;帮助投资者适应不断变化的市场环境。 首先&a…

DangerWind-RPC-framework---三、服务端下机

当一台机器下线时&#xff0c;面临很多问题&#xff1a;如何将其从注册中心下线&#xff1f;如何清理释放资源&#xff1f;客户端拉取服务列表时也使用了本地缓存&#xff0c;如何及时更新本地缓存&#xff1f; 服务端机器的优雅下线需要使用ShutdownHook&#xff0c;这相当于添…

前端八股文 插槽的使用场景

什么是插槽 官方解释&#xff1a;Vue 实现了一套内容分发的 API&#xff0c;将 元素作为承载分发内容的出口。 大白话&#xff1a;插槽就是子组件中的提供给父组件使用的一个占位符&#xff0c;用<slot> 表示&#xff0c;父组件可以在这个占位 符中填充任何模板代码&am…

苹果笔记本电脑能玩哪些游戏 苹果电脑可以玩的单机游戏推荐

苹果笔记本有着优美的外观和强大的性能。用户不仅可以使用苹果笔记本办公、剪辑&#xff0c;越来越多的用户开始关注苹果笔记本在游戏领域的表现&#xff0c;尤其是在大型游戏方面。本文将为你详细介绍苹果笔记本都能玩什么游戏&#xff0c;以及为你推荐苹果电脑可以玩的单机游…

Mybatis之动态sql、缓存、分页、配置数据源

SQL动态查询 if标签 当传递某个DTO时&#xff0c;需要根据某个属性是否存在而动态增加条件时&#xff0c;就可以使用if标签 <select id"getUser" resultType"user">select id, name, age, sex from user where 11<if test"userDto.name !…

EventBus原理分析

EventBus 是一个流行的事件发布/订阅框架&#xff0c;主要用于简化 Android 应用中不同组件之间的通信。它的设计基于观察者模式&#xff0c;可以有效地减少组件间的耦合性&#xff0c;使得代码更加模块化和可维护。 下面是 EventBus 的实现原理&#xff0c;结合其源码进行说明…

快到不可思议!Internet Download Manager下载器,让你的网速飞起来!

&#x1f31f; 快到不可思议&#xff01;Internet Download Manager下载器&#xff0c;让你的网速飞起来&#xff01;&#x1f680; 嗨喽&#xff0c;各位csdn的朋友们&#xff01;&#x1f44b;今天我要跟大家分享一个我超爱的下载神器——Internet Download Manager&#xff…