后端开发——统一处理异常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 {

    @ExceptionHandler
    public 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【INTEL(ALTERA)】Agilex7 FPGA Development Kit DK-DEV-AGI027R1BES编程/烧录/烧写/下载步骤

DK-DEV-AGI027R1BES 的编程步骤: 将外部 USB Blaster II 连接到 J10- 外部 JTAG 接头。将交换机 SW5.3 设置为 ON(首次)。打开 英特尔 Quartus Prime Pro Edition 软件编程工具。单击 硬件设置 ,然后选择 USB Blaster II。将硬件…

LeetCode - 460 LFU缓存(Java JS Python)

题目来源 460. LFU 缓存 - 力扣(LeetCode) 题目描述 请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。 实现 LFUCache 类: LFUCache(int capacity) - 用数据结构的容量 capacity 初始化对象int get(int key)…

RocketMQ系统性学习-SpringCloud Alibaba集成RocketMQ以及消息追踪、延时消息实战

文章目录 消息追踪延时消息实战 消息追踪 设置消息追踪需要修改 broker 启动的配置文件,添加一行配置:traceTopicEnabletrue 即可,操作如下: # 进入到 rocketmq 的安装目录中 # 先复制一份配置文件 cp broker.conf custom.conf …

高并发音频转口型服务器开发

课程名称:高并发口型服务器开发 高并发口型服务器 哈喽,大家好,我叫人宅,很高兴和大家一起分享本套课程,高并发口型服务器开发。 虚拟人的口型一直是我们避免不了问题,即使我们不做虚拟人实时口型&#x…

WorkPlus搭建高效即时通讯,打造高效协作新标杆

在现代企业中,即时通讯已成为团队沟通和协作的重要组成部分。作为一款创新的即时通讯工具,WorkPlus致力于提供高效、便捷的沟通和协作体验,打造全新的企业沟通标杆。 WorkPlus的出色之处在于其高效的即时通讯能力。无论是团队内部交流还是跨团…

H266/VVC标准的编码结构介绍

概述 CVS: H266的编码码流包含一个或多个编码视频序列(Coded Video Swquence,CVS),每个CVS以帧内随机接入点(Intra Random Access Point, IRAP)或逐渐解码刷新(Gradual …

MySQL 教程 2.2

MySQL WHERE 子句 我们知道从 MySQL 表中使用 SELECT 语句来读取数据。 如需有条件地从表中选取数据,可将 WHERE 子句添加到 SELECT 语句中。 WHERE 子句用于在 MySQL 中过滤查询结果,只返回满足特定条件的行。 语法 以下是 SQL SELECT 语句使用 WH…

项目实战:自动驾驶之方向盘操纵

项目介绍 根据汽车前方摄像头捕捉的画面,控制汽车方向盘转动的方向和角度,这是自动驾驶要解决的核心问题。这个项目主要是通过使用深度神经网络解决一个回归问题。不同于分类、识别场景,回归问题中神经网络输出的是一个连续的值。 通过这个项目的学习,可以将神经网络用于通…

Python开源项目周排行 2023年第40周

Python 趋势周报,按周浏览往期 GitHub,Gitee 等最热门的Python开源项目,入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后,都是当周相对热门的项目。 入选公式=70%GitHub Trending20%Gitee10%其他 关注微…

CSS 的背景属性(开发中常用)

目录 1 内容预览 背景颜色 背景图片 背景平铺 背景图片位置(常用) 背景图像固定 背景复合写法 背景色半透明 实现案例 1 内容预览 背景属性可以设置背景颜色、背景图片、背景平铺、背景图片位置、背景图像固定等。 注意: 把表格中的五个属背下来&#xff0c…

搞懂这6 个持续集成工具,领先80%测试人!

开发人员喜欢把写的代码当成自己的孩子,他们会被当成艺术品一样呵护。作为家长,总是会认为自己的孩子是最好的,也会尽全力给自己的孩子最好的,就算有时候会超出自己的能力范围。 最终,孩子会走出去,和其他…

京东看数据-京东运营数据分析-10月宠物市场销售数据分析(宠物店铺数据查询)

近年来,宠物成为越来越多家庭的成员,宠物数量不断增长,“宠物经济”异军突起,成为消费市场中特殊的存在。“撸猫”“吸狗”正迅速成为人们交际的热门谈资,宠物经济也迈入快速发展阶段。 根据鲸参谋电商数据分析平台的相…

fckeditor编辑器改造示例:增加PRE,CODE控件

查看专栏目录 Network 灰鸽宝典专栏主要关注服务器的配置,前后端开发环境的配置,编辑器的配置,网络服务的配置,网络命令的应用与配置,windows常见问题的解决等。 文章目录 修改方法:1)修改fckco…

JS基本语法

JS基本语法 变量数据类型原始数据类型 函数定义第一种方式第二种方式 JS 对象ArrayStringJavaScript 自定义对象JSONDOMBOM JS 事件事件监听事件绑定常见事件 变量 数据类型 原始数据类型 函数定义 第一种方式 第二种方式 JS 对象 Array String JavaScript 自定义对象 JSON …

VR汽车技术服务虚拟仿真实训平台更好地辅助职业上岗培训

VR汽车虚拟仿真教学软件是一种基于虚拟现实技术的教学辅助工具。它能够模拟真实的汽车环境和操作场景,让学生能够通过虚拟仿真来学习和实践汽车相关知识和技能。 与传统的教学方式相比,VR汽车虚拟仿真教学软件具有更高的视觉沉浸感和互动性,能…

19.Tomcat搭建

Tomcat 简介 Tomcat的安装和启动 前置条件 • JDK 已安装(JAVA_HOME环境变量已被成功配置) Windows 下安装 访问 http://tomcat.apache.org ⇒ 左侧边栏 “Download” 2. 解压缩下载的文件到 “D:\tomcat”, tomcat的内容最终被解压到 “D:\tomcat\apache-tomcat-9.0.84” 3.…

Stable LM Zephyr 3B:手机上的强大LLM助手

概览 最近,Stability.ai宣布开源了Stable LM Zephyr 3B,这是一个30亿参数的大语言模型(LLM),专为手机、笔记本等移动设备设计。其突出的特点是参数较小、性能强大且算力消耗低,能够自动生成文本、总结摘要…

PLC-Recorder V3 修改服务器和客户端通讯端口的方法

PLC-Recorder V3是服务器和客户端的架构,他们之间用TCP通讯。如果客户端无法与服务器建立连接(重启也无效,并且确保没有老版本的PLC-Recorder在运行),则可能是端口被占用了。这时候需要修改他们之间的通讯端口&#xf…

打造‘产业大数据综合服务平台’,助力智慧园区建设!

随着大数据、人工智能、云计算、物联网等新一代信息技术的发展与应用,我国各类型园区正在向“智慧园区”转型升级,逐步开启数字化、智能化的运营管理模式。智慧园区的建设不仅需要基础设施的智慧化,更要实现园区规划、运营、管理、服务的智慧…

求解最大子段和问题

求解最大子段和问题。 对于给定序列a1,a2,a3……an,寻找它的某个连续子段,使得其和最大。如( -2,11,-4,13,-5,-2 )最大子段是{ 11,-4,13 }其和为20。 要求:分别用教材所给的三种方法求解(简单方法、分治法、动态规划)&#xff0…