后端开发——统一处理异常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状态。 这是为什么呢? 本文将…

普冉(PUYA)单片机开发笔记(12): 获取外部中断

概述 将单片机的 GPIO 引脚作为外部按键的输入端是单片机较为常用的方式,例如把这颗 MCU 部署在一块控制面板的触点底板,使用者按压按钮(按键)对产品进行控制。本着学以致用的原则,使用 PY32F003 对外部中断如何处理是…

【漏洞复现】系列集合

该篇文章仅供学习网络安全技术参考研究使用,请勿使用相关技术做违法操作 Apache Apache_HTTPD_未知后缀名解析Apache_HTTPD_换行解析(CVE-2017-15715)Apache_HTTPD_多后缀解析Apache_HTTP_2.4.50_路径穿越(CVE-2021-42013)Apache_HTTP_2.4.49_路径穿越(CVE-2021-41…

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

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

高效网络爬虫:代理IP的应用与实践

💂 个人网站:【 海拥】【神级代码资源网站】【办公神器】🤟 基于Web端打造的:👉轻量化工具创作平台🤟 代理 IP 推荐:👉品易 HTTP 代理 IP 💅 想寻找共同学习交流的小伙伴&#xff0c…

Flink系列之:State Time-To-Live (TTL)

Flink系列之:State Time-To-Live TTL 一、TTL二、TTL实现代码三、过期状态的清理 一、TTL Flink的TTL(Time-To-Live)是一种数据过期策略,用于指定数据在流处理中的存活时间。TTL可以应用于Flink中的状态或事件时间窗口&#xff0…

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

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

太强了!利用 Python 连接 ES 查询索引某个字段命中数的脚本!

作者:JackTian 来源:公众号「杰哥的IT之旅」 ID:Jake_Internet 链接:太强了!利用 Python 连接 ES 查询索引某个字段命中数的脚本! 当我们在工作中,如果频繁查询 Elasticsearch 某个索引中的某个…

关于laravel的逻辑删除deleted_at与mysql唯一索引unique

使用mysql组合key去设置唯一索引unique时,可以避免因各种原因导致的重复脏数据问题,但由于我们绝大多数表都不建议采取物理删除的方式去对待可爱的数据们,因此我们常常使用逻辑删除(软删除)的方式去对错误数据或无效数…

计算机视觉(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 …

分面中添加不同表格

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

k8s 安装firewalld导致的网络疑难问题处理

场景 ubuntu 操作系统,部署了k8s集群,n 台 机器,某些机器之间 telnet ip 10250不通。 ufw 是关闭的,然后抓包会看到如下错误 04:43:09.154362 IP 192.168.1.3.56608 > 192.168.1.183.8000: Flags [S], seq 3664350430, win 64240, options [mss 1460,sackOK,TS val 281…

计算机网络(四)

九、网络安全 (一)什么是网络安全? 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。通过这…

2.5【渲染】Blitting

一,Blit的概念 Blit是一种计算机图形学中常用的数据操作,基础原理是使多个位图通过布尔函数(boolean function)组合成一个新位图。在U3D中,常说的Blit其实是渲染后期的一个概念,它将摄像机渲染好的一个图的所有像素点,通过各种形式的运算,然后重新绘制到屏幕。这种达到…

【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 >…