【Spring实战】27 统一异常处理最佳实践

文章目录

    • 1. 自定义异常
    • 2. 统一异常处理
    • 3. 配置
    • 4. 应用
    • 5. 启动类
    • 6. 启动服务
    • 7. 验证
    • 8. 优点
    • 总结

在 Spring 项目中,有效的异常处理是确保应用程序稳定性用户体验的关键因素之一。通过实现统一异常处理,我们能够更好的管理和响应应用程序中的各种异常情况。本文将介绍在 Spring 项目中如何实现统一异常处理的最佳实践。

1. 自定义异常

首先,我们需要定义一些自定义异常类,以便能够区分和处理不同类型的异常。这样我们就可以在异常处理器中根据异常类型进行不同的处理。例如:此处我们定义了两种异常,找不到资源异常和校验失败异常。

ResourceNotFoundException.java

表示资源未找到的异常

package com.cheney.demo.exception;public class ResourceNotFoundException extends RuntimeException {public ResourceNotFoundException() {super("Resource not found");}public ResourceNotFoundException(String message) {super(message);}public ResourceNotFoundException(String message, Throwable cause) {super(message, cause);}
}

ValidationException.java

表示验证失败的异常

package com.cheney.demo.exception;public class ValidationException extends RuntimeException {public ValidationException() {super("Validation failed");}public ValidationException(String message) {super(message);}public ValidationException(String message, Throwable cause) {super(message, cause);}
}

上述两个自定义异常类的代码中:

  • 我们继承了 RuntimeException,这是一个运行时异常,它通常用于表示程序无法继续执行的情况。
  • 我们提供了多个构造函数,以便在创建异常实例时能够传递不同的信息和异常原因。
  • 构造函数中的 super 调用是为了将异常信息传递给父类,以便在异常发生时能够捕获和记录相关信息。

2. 统一异常处理

接下来,我们创建一个全局异常处理类,使用 @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.bind.annotation.ResponseStatus;@ControllerAdvice
public class GlobalExceptionHandler {// 处理找不到资源异常@ExceptionHandler(ResourceNotFoundException.class)@ResponseStatus(HttpStatus.NOT_FOUND)public ResponseEntity<String> handleNotFoundException(ResourceNotFoundException ex) {return new ResponseEntity<>("找不到资源!", HttpStatus.NOT_FOUND);}// 处理校验失败异常@ExceptionHandler(ValidationException.class)@ResponseStatus(HttpStatus.BAD_REQUEST)public ResponseEntity<String> handleValidationException(ValidationException ex) {return new ResponseEntity<>("校验失败!", HttpStatus.BAD_REQUEST);}// 处理其他异常@ExceptionHandler(Exception.class)@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)public ResponseEntity<String> handleException(Exception ex) {return new ResponseEntity<>("服务器异常!", HttpStatus.INTERNAL_SERVER_ERROR);}
}

在这个类中,我们通过 @ExceptionHandler 注解为不同类型的自定义异常定义了处理方法。每个方法都返回适当的HTTP响应码和消息。

3. 配置

确保在 Spring 配置文件中,server.error.include-stacktrace 配置项被设置为 never,以确保不将堆栈跟踪信息返回给客户端:

pom.xml

server.error.include-stacktrace=never

4. 应用

在你的控制器中,当出现需要处理的异常时,抛出相应的自定义异常:

package com.cheney.demo.controller;import com.cheney.demo.exception.ResourceNotFoundException;
import com.cheney.demo.exception.ValidationException;
import org.springframework.core.io.Resource;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("demo")
public class DemoController {@GetMapping("resource")public ResponseEntity<Resource> checkResource() {// 业务逻辑,然后根据判断抛出异常throw new ResourceNotFoundException();// 正常返回}@GetMapping("validation")public ResponseEntity<Resource> checkValidation() {// 业务逻辑,然后根据判断抛出异常throw new ValidationException();// 正常返回}@GetMapping("other")public ResponseEntity<Resource> checkOther() throws Exception {// 业务逻辑,然后根据判断抛出异常throw new Exception();// 正常返回}
}

5. 启动类

DemoApplication.java

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

6. 启动服务

在这里插入图片描述

7. 验证

1)访问下面 URL 验证 GlobalExceptionHandler 中的 handleNotFoundException 方法

http://localhost:8080/demo/resource

在这里插入图片描述

2)访问下面 URL 验证 GlobalExceptionHandler 中的 handleValidationException 方法

http://localhost:8080/demo/validation

在这里插入图片描述

3)访问下面 URL 验证 GlobalExceptionHandler 中的 handleException 方法

http://localhost:8080/demo/other

在这里插入图片描述

8. 优点

  • 一致性

    统一异常处理确保应用程序在不同地方抛出的异常都能够得到一致的处理方式。无论是在控制器、服务层、还是其他组件中,都能够通过相同的规则进行异常处理,保持了一致性。

  • 代码可读性

    通过将异常处理集中在一个地方,提高了代码的可读性。不同类型的异常有各自的处理逻辑,开发人员无需在每个地方都编写相同的异常处理代码,而是集中在全局异常处理器中进行维护。

  • 减少重复代码

    统一异常处理减少了代码中的冗余和重复,使得开发者能够更专注于业务逻辑而不是异常处理。这有助于减少错误,并提高开发效率。

  • 集中式问题追踪

    当应用程序遇到问题时,异常信息被集中记录,使得问题的诊断和修复更加方便。全局异常处理器允许你自定义日志输出、监控或通知等行为,方便问题的集中式追踪。

  • 用户友好的错误响应

    通过全局异常处理,可以为不同类型的异常定义适当的用户友好的错误响应。这有助于提高用户体验,让用户更容易理解发生了什么问题。

  • 安全性

    统一异常处理可以处理安全相关的异常,比如认证失败、权限不足等。通过在全局异常处理器中处理这些异常,可以更好地保护应用程序的安全性。

  • 灵活性

    全局异常处理允许开发者灵活地定义处理不同类型异常的策略。你可以根据具体的业务需求,为每种异常类型定义特定的处理方式,而不是在每个地方都硬编码相同的异常处理逻辑。

总结

通过这种方式,当你的应用程序中的任何地方抛出自定义异常时,全局异常处理类将捕获它并相应地处理异常。这提供了一种一致的方式来处理异常,提高了代码的可读性和可维护性。通过实现这些步骤,你可以在 Spring 项目中轻松实现统一异常处理,确保应用程序在面对异常情况时表现出一致的行为,提高用户体验和开发效率。

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

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

相关文章

Phi-2小语言模型QLoRA微调教程

前言 就在不久前&#xff0c;微软正式发布了一个 27 亿参数的语言模型——Phi-2。这是一种文本到文本的人工智能程序&#xff0c;具有出色的推理和语言理解能力。同时&#xff0c;微软研究院也在官方 X 平台上声称&#xff1a;“Phi-2 的性能优于其他现有的小型语言模型&#…

安卓(雷电)模拟器清除屏幕密码

1、设置磁盘可写 启动模拟器&#xff0c;然后在模拟器的设置界面&#xff0c;设置磁盘共享为可写入&#xff0c;重启模拟器&#xff0c;如下图&#xff1a; 2、找到模拟器目录 返回桌面&#xff0c;右键模拟器图标&#xff0c;打开文件所在目录&#xff0c;如下图&#xff1a…

javaWebssh校园物业管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh校园物业管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用 B/S模式开发。开发环境为TOMCAT7.…

如何申请api接口,快速对接数据源

申请API接口并快速对接数据源通常需要以下步骤&#xff1a; 寻找合适的API供应商&#xff1a;首先需要找到提供所需数据的API供应商&#xff0c;可以通过搜索引擎或者专业的API市场找到合适的API接口服务提供商。 注册并获取API密钥&#xff1a;在供应商的网站上注册账户&…

蓝牙物联网多个核心应用场景开发与应用细化分析

蓝牙物联网是指利用蓝牙技术将物理设备与互联网连接起来&#xff0c;实现设备之间的信息共享与互通。蓝牙物联网在各个领域得到了广泛应用&#xff0c;并且在未来有着巨大的发展潜力。本文将围绕蓝牙物联网的五大核心应用场景进行介绍&#xff0c;包括智能家居、智能健康、智能…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑电氢耦合和碳交易的电氢能源系统置信间隙鲁棒规划》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这标题涉及到一个复杂的能源系统规划问题&#xff0c;其中考虑了电氢耦合、碳交易和置信间隙鲁棒规划。以下是对标题各个部分的解读&#xff1a; 电氢耦…

矩阵中的最长递增路径

题目链接 矩阵中的最长递增路径 题目描述 注意点 不能 在 对角线 方向上移动或移动到 边界外&#xff08;即不允许环绕&#xff09; 解答思路 因为最长递增路径一定是连续的&#xff0c;所以想到使用深度优先遍历来做。如果只使用深度优先遍历会导致超时&#xff08;同一个…

MT6785安卓核心板_联发科MTK6785/Helio G95/曦力G95核心板定制

MT6785安卓核心板是基于MT6785(Helio G95)处理器&#xff0c;具备八核处理器结构&#xff0c;包括2颗主频为2.05GHz的Cortex A76处理器和6颗主频为2.0GHz的Cortex A55处理器&#xff0c;以及六颗Cortex-A55处理器。而在GPU方面&#xff0c;采用了Arm Mali-G76 MC4&#xff0c;频…

ESP32-Touch(Arduino)

Touch Touch传感器是一种外围设备&#xff0c;具有内部振荡器电路&#xff0c;可在固定时间段内测量相应GPIO引脚上的充电/放电频率。 因此&#xff0c;这些触摸传感器也被称为电容式传感器。例如&#xff0c;如果您触摸这些引脚中的任何一个&#xff0c;手指电荷将改变这个周…

MATHPILE:一个高质量的大规模的数学语料库

简介 MATHPILE&#xff1a;一个高质量、大规模的数学语料库&#xff0c;29 GB&#xff0c;包含约 95 亿个token。涵盖从 K-12 到大学、研究生水平和数学竞赛的内容&#xff0c;包括高质量教科书、讲义、科学论文等。提供详细的数据记录&#xff0c;包括数据集表格和质量注释&a…

渐变登录页

效果演示 实现了一个简单的登录页面的样式和交互效果。 Code <div class"flex"><div class"login color">Login</div><label class"color">Username :</label><input type"text" class"input&…

已安装MySQL5.7的基础上安装MySQL8教程

类似文章很多&#xff0c;但部分问题解决方案并不是很完整&#xff0c;且对细节描述不够清楚&#xff0c;特意总结一篇 在本机已经安装MySQL5.7的情况下新安装MySQL8.x的方案如下&#xff08;请按照步骤详细操作&#xff09;&#xff1a; 1.进入官网下载 https://dev.mysql.c…

【Emgu.CV教程】4.3、无缝融合应用之SeamlessClone()

SeamlessClone()函数才是真正的无缝克隆&#xff0c;它可以将一张小一点的图片&#xff0c;复制到另一张大一点的图片中&#xff0c;并且复制的位置可以用户自己定义&#xff0c;先看一下它的函数介绍&#xff1a; public static void SeamlessClone(IInputArray src, // 输入…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -投票创建后端实现

锋哥原创的uniapp微信小程序投票系统实战&#xff1a; uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

phpcms v9后台添加草稿箱功能

一、后台添加文章模板phpcms/modules/content/templates/content_add.tpl.php中94行增加”保存草稿“按钮&#xff1a; <div class"button"><input value"<?php echo L(save_draft);?>" type"submit" name"dosubmit_draf…

读算法霸权笔记13_读后总结与感想兼导读

1. 基本信息 算法霸权&#xff1a;数学杀伤性武器的威胁 [美] 凯西奥尼尔(Cathy 著 中信出版社,2018年9月出版 1.1. 读薄率 书籍总字数220千字&#xff0c;笔记总字数32359字。 读薄率32359220000≈14.71% 1.2. 读厚方向 算法的力量&#xff1a;人类如何共同生存&#x…

阻塞队列(JAVA)

阻塞队列是一种特殊的队列&#xff0c;也遵守 "先进先出" 的原则。 阻塞队列能是一种线程安全的数据结构, 并且具有以下特性: 当队列满的时候, 继续入队列就会阻塞, 直到有其他线程从队列中取走元素&#xff1b;当队列空的时候, 继续出队列也会阻塞, 直到有其他线程往…

【WinForm.NET开发】Windows窗体设计器错误页

本文内容 黄色栏此错误的实例有关此错误的帮助有关此错误的论坛帖子常见设计时错误 如果 Windows 窗体设计器由于代码、第三方组件或其他位置的错误而未能加载&#xff0c;将显示错误页而不是设计器。 此错误页不一定表示设计器中的 bug。 bug 可能位于代码隐藏文件中的某个位…

STM32F4XX的12位ADC采集数值超过4096右对齐模式设置失败

文章目录 一、前言二、问题1&#xff1a;数值超过4096三、问题1的排错过程四、问题2&#xff1a;右对齐模式设置失败五、问题2的解决方法5.1 将ADC_ExternalTrigConv设置为05.2 使用ADC_StructInit()函数 一、前言 最近在学习STM32的ADC功能&#xff0c;遇到了一个奇怪的问题。…

(一)Spring Cloud 直击微服务作用、架构应用、hystrix降级

直击微服务作用 微服务架构: 遇到了什么问题? 将单体架构拆分成微服务架构后,如果保证多个服务(项目)正常运行? 哪个技术可以解决这个问题? 微服务技术 服务治理: 服务管理,维护服务与服务之间的关系 这个技术如何使用? netflix/网…