后端开发——统一处理异常Spring MVC机制

一、Spring MVC的统一处理异常机制

在Spring MVC中,存在统一处理异常的机制,
具体表现为:无论是哪个处理请求的过程中出现异常,每种类型的异常只需要编写一段处理异常的代码即可!

统一处理异常的核心是定义处理异常的方法:

  • 返回值类型:可参考处理请求的方法
  • 方法名称:自定义
  • 参数列表:至少包含被处理的异常对象,另外,可按需添加存在多个参数时,各参数不区分先后顺序。
  • 注解:必须添加@ExceptionHandler注解,表示此方法是处理异常的方法

在项目的根包下创建ex.handler.GlobalExceptionHandler类,作为当前项目的“全局异常处理器”类。

在类上添加@RestControllerAdvice注解,此类中特定的方法,将可以作用于整个项目中任何处理请求的过程中!
将统一处理异常的代码编写在此类中(各控制器类中不再需要重复的处理异常的方法):
例如:

package com.luoyang.small.ex.handler;import com.luoyang.small.ex.CustomServiceException;
import com.luoyang.small.web.JsonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** 统一处理异常** @author luoyang* @date 2023/12/17*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandlerpublic JsonResult handleServiceException(CustomServiceException e) {log.warn("统一处理CustomServiceException,异常信息:{}", e.getMessage());return JsonResult.fail(e);}
}

二、辅助代码示例

其中对应的CustomServiceException.java

public class CustomServiceException extends RuntimeException {private ServiceCode serviceCode;public CustomServiceException(ServiceCode serviceCode, String message) {super(message);this.serviceCode = serviceCode;}public ServiceCode getServiceCode() {return serviceCode;}
}

其中对应的ServiceCode.java

public enum ServiceCode {OK(200),ERR_NOT_FOUND(404),ERR_CONFLICT(409),ERR_CUSTOM(1000);// 以下属性,表示每个枚举类型的对象都有一个Integer value属性,此属性的值将通过构造方法传入private Integer value;ServiceCode(Integer value) {this.value = value;}// 用于通过枚举对象获取Integer value属性的值public Integer getValue() {return value;}
}

其中对应的JsonResult.java

@Data
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
//@JsonInclude(JsonInclude.Include.NON_NULL) //配置在类上,所以属性为空是都不展示该属性
public class JsonResult implements Serializable {private Integer code;private String message;public static JsonResult ok() {JsonResult jsonResult = new JsonResult();jsonResult.setCode(ServiceCode.OK.getValue());return jsonResult;}public static JsonResult fail(ServiceCode serviceCode, String message) {JsonResult jsonResult = new JsonResult();jsonResult.setCode(serviceCode.getValue());jsonResult.setMessage(message);log.error("JsonResult fail  serviceCode {}, message{}", serviceCode, message);return jsonResult;}public static JsonResult fail(CustomServiceException e) {return fail(e.getServiceCode(), e.getMessage());}
}

三、异常各处抛出,一个类统一处理

CustomServiceException异常各处抛出,如下:GlobalExceptionHandler.handleServiceException统一处理 ,在这里插入图片描述
当客户端向服务器端提交请求,例如“添加相册”,如果服务器端的控制器中处理请求的方法中调用Service方法时出现异常,但是,处理请求的方法不必对此异常进行处理,例如:在这里插入图片描述

当处理请求的方法不使用try..catch...捕获异常,如果出现异常,相当于此处理请求的方法会抛出异常!
在这里插入图片描述

在这里插入图片描述

注意:重点就是在自定义全局类(如:GlobalExceptionHandler)上添加@RestControllerAdvice注解,此类中特定的方法(例如handleServiceException(CustomServiceException e) 统一处理异常的方法)将可以作用于整个项目中任何处理请求的过程中!

创造价值,乐哉分享!
一起入门后端 204146007

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

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

相关文章

【k8s】使用Finalizers控制k8s资源删除

文章目录 词汇表基本删除操作Finalizers是什么?Owner References又是什么?强制删除命名空间参考 你有没有在使用k8s过程中遇到过这种情况: 通过kubectl delete指令删除一些资源时,一直处于Terminating状态。 这是为什么呢? 本文将…

智能优化算法应用:基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于静电放电算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.静电放电算法4.实验参数设定5.算法结果6.…

FME之FeatureReader转换器按表格内容读取矢量数据

问题:平时会遇到只用某个大数据里某小部分数据参与下一步数据处理,此时我们会用到FeatureReader转换器,一般是通过空间关系(相交、包含)来读取相应涉及的图斑矢量,但就有一个问题,加入你的启动器…

计算机视觉(P2)-计算机视觉任务和应用

一、说明 在本文中,我们将探讨主要的计算机视觉任务以及每个任务最流行的应用程序。 二、图像内容分类 2.1. 图像分类 图像分类是计算机视觉领域的主要任务之一[1]。在该任务中,经过训练的模型根据预定义的类集为图像分配特定的类。下图是著名的CIFAR…

格式化Echarts的X轴显示,设置显示间隔

业务需求:x轴间隔4个显示,并且末尾显示23时 x轴为写死的0时-23时,使用Array.from data: Array.from({ length: 24 }).map((_, i) > ${i}时) 需要在axisLabel 里使用 interval: 0, // 强制显示所有刻度标签,然后通过 formatter …

分面中添加不同表格

简介 关于分面的推文,小编根据实际科研需求,已经分享了很多技巧。例如: 分面一页多图 基于分面的面积图绘制 分面中的细节调整汇总 分面中添加不同的直线 基于分面的折线图绘制 最近遇到了另一个需求:在分面中添加不同的表…

计算机网络(四)

九、网络安全 (一)什么是网络安全? A、网络安全状况 分布式反射攻击逐渐成为拒绝攻击的重要形式 涉及重要行业和政府部门的高危漏洞事件增多。 基础应用和通用软硬件漏洞风险凸显(“心脏出血”,“破壳”等&#x…

Content-Type是什么

目录 Content-Type是什么 获取方式 设置方式 常见类型 application/x-www-form-urlencoded multipart/form-data application/json text/xml text/html text/plain Content-Type是什么 Content-Type出现在请求标头和响应标头中,意思是内容类型&#xff0…

LOF基金跟股票一样吗?

LOF基金,全称为"上市型开放式基金",是一种可以在上海证券交易所认购、申购、赎回及交易的开放式证券投资基金。投资者可以通过上海证券交易所场内证券经营机构或场外基金销售机构进行认购、申购和赎回基金份额。 LOF基金的特点是既可以像股票…

论文阅读——GroupViT

GroupViT: Semantic Segmentation Emerges from Text Supervision 一、思想 把Transformer层分为多个组阶段grouping stages,每个stage通过自注意力机制学习一组tokens,然后使用学习到的组tokens通过分组模块Grouping Block融合相似的图片tokens。通过这…

【docker 】基于Dockerfile创建镜像

Dockerfile文档 Dockerfile文档地址 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。 DockerFile 可以说是一种可以被 Docker 程序解释的脚本,DockerFile 是由一条条的命令组成的,每条命令对应 …

LCR 181. 字符串中的单词反转

解题思路: class Solution {public String reverseMessage(String message) {message message.trim(); // 删除首尾空格int j message.length() - 1, i j;StringBuilder res new StringBuilder();while (i > 0) {while (i >…

极智一周 | 两系列汇总、MI300X、H100、特供芯片、GPT-4、火灾检测、酷睿Ultra And so on

欢迎关注我的公众号 [极智视界],获取我的更多技术分享 大家好,我是极智视界,带来本周的 [极智一周],关键词:两系列汇总、MI300X、H100、特供芯片、GPT-4、火灾检测、酷睿Ultra And so on。 邀您加入我的知识星球「极智…

数据分析为何要学统计学(2)——如何估计总体概率分布

明确总体的概率分布类型及参数是进行数据分析的基础,这项工作称为分布推断与参数估计。在总体分布及其参数不明确的情况下,我们可以利用手头掌握的样本来完成这项工作。具体过程由以下步骤组成。 第一步,样本统计特性直观估计 我们采用Seab…

在ViewPager下面加圆点指示(使用selector方式)

前面讲了如何使用ViewPager来做多个可滑动的页面。今天在页面的下面加上一排小圆点,用于指示当前在第几页。效果如下(请忽略颜色和图案): 一、产生一个小圆点的视图 1、在drawable下产生一个选中和不选中颜色不同的小圆点形状&am…

1- Electron 创建项目、初始化项目

Electron官网 Build cross-platform desktop apps with JavaScript, HTML, and CSS | Electron Electron 初始化 初始化项目 - 构造package.json npm init -y 安装Electron模块包 npm i electron -D // 注意!如果报错查看node包是否太高 配置启动脚本 {&quo…

SQL、Jdbc、JdbcTemplate、Mybatics

数据库:查询(show、select)、创建(create)、使用(use)、删除(drop)数据库 表:创建(【字段】约束、数据类型)、查询、修改(alter *add)、删除 DML:增加(inse…

MySql的增、删、改、查(MySql数据库学习——五)

增(数据添加/插入数据) 使用 INSERT INTO SQL 语句来插入数据。我们可以通过 mysql> 命令提示窗口中向数据表中插入数据,或者 通过PHP 脚本来插入数据。 sql语句: INSERT INTO table_name ( field1, field2,...fieldN ) …

AC843. n皇后问题--60

我们只需要把蓝色的往上移动就行了 if(!col[i][j]&&!dg[ui]&&!udg[])//1y(i)向下,x(u)向右为正。yxb的by-x一定>0,y-xb的bxy可能>0,这个不考虑,只看-bxy. 为什么for里面只有一个if呢…

操作系统期末复习-内存管理

一、内存管理 分页存储管理,是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块&#xf…