当前位置: 首页 > news >正文

08-学成在线项目中统一异常处理的规范

项目中的异常处理

规范异常类型

在Service类的业务方法中有很多的参数合法性校验,当请求参数不合法的时候会抛出异常,但此时异常信息只会在控制台输出,前端界面并不会提示用户

实际开发中前端和后端需要做一些约定: 一般将错误提示信息统一以json格式返回给前端,以HTTP状态码决定当前请求是否出错(非200为操作异常)

{"timestamp":"2023-02-02T14:42:36.820+00:00",// 添加课程时设置一个负数的课程价格会报500异常"status":500,"error":"Internal Server Error","message":"","path":"/content/course"
}

为了统一处理异常信息,我们需要在业务方法中自定义并规范项目中抛出的异常类型,这样可以便于统一去捕获这一类或几类的异常

  • 对于业务方法中抛出的非项目自定义的异常类型即未知异常,则统一向用户提示指定的错误信息如执行过程异常请重试的

规范了异常类型, 我们还需要去捕获异常信息,使用try/catch方式去捕获代码比较臃肿,可以统一由SpringMVC提供的控制器增强类去完成异常的捕获

在这里插入图片描述

异常处理(base工程)

第一步: 添加依赖,在base基础工程实现统一异常处理,由于各模块依赖了base基础工程所以都可以使用异常处理

<dependency><groupId>org.springframework</groupId><artifactId>spring-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>

第二步: 定义一个枚举类CommonError,枚举一些通用的异常信息对象

package com.xuecheng.base.execption;
/**
* @description 通用错误信息
*/
public enum CommonError {UNKOWN_ERROR("执行过程异常,请重试"),PARAS_ERROR("非法参数"),OBJECT_NULL("对象为空"),QUERY_NULL("查询结果为空"),REQUEST_NULL("请求参数为空");private String errMessage;public String getErrMessage() {return errMessage;}CommonError(String errMessage) {this.errMessage = errMessage;}
}

第三步: 自定义项目的异常类型XueChengPlusException

package com.xuecheng.base.execption;
/**
* @description 学成在线项目异常类
*/
public class XueChengPlusException extends RuntimeException {private String errMessage;public String getErrMessage() {return errMessage;}public XueChengPlusException() {super();}public XueChengPlusException(String errMessage) {super(errMessage);this.errMessage = errMessage;}public static void cast(CommonError commonError) {throw new XueChengPlusException(commonError.getErrMessage());}public static void cast(String errMessage) {throw new XueChengPlusException(errMessage);}
}

第四步: 自定义响应异常信息的模型类

package com.xuecheng.base.execption;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class RestErrorResponse implements Serializable {private String errMessage;
}

第五步: 定义全局异常处理器去捕获异常信息同时记录异常日志, 将异常信息封装到异常信息的模型类并响应给用户,实现微服务端全局异常处理

  • @ControllerAdvice或@RestControllerAdvice)(类上): 将当前类标识为异常处理的组件
  • @ExceptionHandler(方法或类上): 用于表明方法处理的异常类型,可以指定一个或多个
  • @ResponseStatus(方法或类上): 标记捕获异常的方法或类指定发生异常时异常处理器向前端响应的状态码和原因
package com.xuecheng.base.execption;
/**
* @description 全局异常处理器
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {@ResponseBody@ExceptionHandler(XueChengPlusException.class)// 处理项目自定义异常类型@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 该异常枚举对象的错误码为500public RestErrorResponse customException(XueChengPlusException exception) {log.error("系统异常:{}", exception.getErrMessage());return new RestErrorResponse(exception.getErrMessage());}@ResponseBody@ExceptionHandler(Exception.class)// 未知类型的异常@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)// 该异常枚举对象的错误码为500public RestErrorResponse exception(Exception exception) {log.error("系统异常:{}", exception.getMessage());return new RestErrorResponse(exception.getMessage());}
}

异常处理测试(api工程)

第一步: 在内容管理服务的api工程中添加base工程的依赖

<dependency><groupId>com.xuecheng</groupId><artifactId>xuecheng-plus-base</artifactId><version>0.0.1-SNAPSHOT</version>
</dependency>

第二步: 当业务方法中出现异常时抛出项目自定义的异常类型,这里以新增课程的业务方法为例进行代码修改

@Override
public CourseBaseInfoDto createCourseBase(Long companyId,AddCourseDto dto) {//合法性校验if (StringUtils.isBlank(dto.getName())) {throw new XueChengPlusException("课程名称为空");}if (StringUtils.isBlank(dto.getMt())) {throw new XueChengPlusException("课程分类为空");}if (StringUtils.isBlank(dto.getSt())) {throw new XueChengPlusException("课程分类为空");}if (StringUtils.isBlank(dto.getGrade())) {throw new XueChengPlusException("课程等级为空");}if (StringUtils.isBlank(dto.getTeachmode())) {throw new XueChengPlusException("教育模式为空");}if (StringUtils.isBlank(dto.getUsers())) {throw new XueChengPlusException("适应人群");}	if (StringUtils.isBlank(dto.getCharge())) {throw new XueChengPlusException("收费规则为空");}if(charge.equals("201001")){if(courseMarketNew.getPrice() ==null || courseMarketNew.getPrice().floatValue()<=0){throw new XueChengPlusException("课程的价格不能为空并且必须大于0");}}
}

第三步: 使用HTTP Client进行测试,故意将收费课程价格设置为负数, 查看捕获到的响应信息

在这里插入图片描述

POST http://localhost:53040/content/courseHTTP/1.1 500 
Content-Type: application/json
Transfer-Encoding: chunked
Date: Fri, 03 Feb 2023 02:32:20 GMT
Connection: close{"errMessage": "课程设置了收费,价格不能为空,且必须大于0"
}

相关文章:

08-学成在线项目中统一异常处理的规范

项目中的异常处理 规范异常类型 在Service类的业务方法中有很多的参数合法性校验,当请求参数不合法的时候会抛出异常,但此时异常信息只会在控制台输出,前端界面并不会提示用户 实际开发中前端和后端需要做一些约定: 一般将错误提示信息统一以json格式返回给前端,以HTTP状态码…...

解析生效探测方法

linux dig命令 1.最常用的查询命令 dig baidu.com2 . 根据记录类型进行查询&#xff0c;比如MX&#xff0c;CNAME&#xff0c;NS&#xff0c;PTR等&#xff0c;只需将类型加在命令后面即可。 dig a.shifen.com ns3 . 指定域名DNS服务器测试解析是否生效的命令&#xff0c;以…...

【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷11

单选题 1、在阅读文章和接受信息时注意区分事实和观点十分重要。事实&#xff08;或称为命题&#xff09;不同于观点的一个主要特征是 A、可以被证实或证伪 B、是准确无误的 C、是正式的表达 D、表达了个人看法 答案&#xff1a;A 2、现代意义的知识产权是在多数国家都受…...

视频集中存储/磁盘阵列EasyCVR平台黑名单异常解决步骤是什么?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…...

Spring Boot + MyBatis-Plus实现数据库读写分离

文章目录 1. 引言2. MyBatis-Plus简介3. 准备工作4. 配置数据源5. 配置MyBatis-Plus6. 创建实体类和Mapper接口7. 编写Service8. 控制器层9. 测试10. 数据库读写分离的原理11. 拓展11.1. 动态数据源11.2. 多数据源事务管理11.3. 多租户支持 12. 总结 &#x1f389;Spring Boot …...

数据同步异常处理,数据同步重试机制(Java)

一、应用场景 在数据同步时&#xff0c;偶尔会出现代码异常之外的问题。例如网络异常、服务器断电… 如果在以上异常片段中&#xff0c;原始数据库新增了一批数据&#xff0c;同步数据库则会丢失这部分数据 二、实现思路 为了解决以上问题&#xff0c;保证原始数据库操作的每…...

STM32F407-14.3.5-01捕获_比较通道

捕获/比较通道 每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器) 包括: 捕获的输入部分(数字滤波、多路复用和预分频器)&#xff0c; 输出部分(比较器和输出控制)。 中文参考手册中框图分成了三大模块, 把框图合并成了一个整体,以便更好的理解捕获输…...

【Python 训练营】N_12 打印菱形图案

题目 打印菱形图案 分析 先把图形分成两部分来看待&#xff0c;前四行一个规律&#xff0c;后三行一个规律&#xff0c;利用双重for循环&#xff0c;第一层控制行&#xff0c;第二层控制列。 答案 # 方法一 for i in range(4):block **(2*i1)print({:^7}.format(block))…...

risc-v异常处理

异常与中断的关系 中断和异常都为异常&#xff0c;分为&#xff1a; 同步异常&#xff1a;IO&#xff0c;illegal, page fault&#xff0c;miss_aligh 等来自处理器内部的发生的异常。异步异常&#xff08;中断&#xff09;&#xff1a;鼠标&#xff0c;键盘&#xff0c;Time…...

SQL注入-数据库基础/SQL语法

目录 一&#xff0c;数据库概述 1.1 数据库 1.2 了解 ACID 理论 1.3 识别数据库 二&#xff0c;SQL 语法基础 三&#xff0c;SQL语句实例 3.1 SQL基础语句 3.2 SQL高级语句 四&#xff0c;基于SQL注入理解语法/函数 4.1 语法 4.2 函数 五&#xff0c;目录数据库info…...

Blazor Select 实现点击一次选项触发一次后台事件

Blazor的官方案例中&#xff0c;Select组件只有两个事件 1、OnSelectedItemChanged 每次选项的时候改变触发&#xff0c;如果你点击同一个选项是不会触发后台的方法的 2、OnBeforeSelectedItemChange 我们可以用这个事件实现每次点击同一个选项都可以触发后台事件 需要注意下最…...

只会在终端使用Python运行代码?这些高级用法了解了解

大部分同学在终端使用Python可能只是简单的执行代码&#xff0c;但其实结合一些Python内置模块或第三方库可以实现更高级且便捷的用法&#xff0c;一起看看吧 插播&#xff0c;更多文字总结指南实用工具科技前沿动态第一时间更新在公粽号【啥都会一点的研究生】 代码Benchmar…...

图论 2023.11.27

Kruskal定义不同的优先级 P3623 [APIO2008] 免费道路 给定一个无向图&#xff0c;其中一些边是0&#xff0c;其他边为1 两个不同的点之间都应该一条且仅由一条边连接 并保持刚好K条0&#xff0c;求是否有解决方案 n<2e4,m<1e5 Kruskal定义不同的优先级 思路&#xff1a;…...

蓝桥杯day02——Fizz Buzz

1、题目 给你一个整数 n &#xff0c;找出从 1 到 n 各个整数的 Fizz Buzz 表示&#xff0c;并用字符串数组 answer&#xff08;下标从 1 开始&#xff09;返回结果&#xff0c;其中&#xff1a; answer[i] "FizzBuzz" 如果 i 同时是 3 和 5 的倍数。answer[i] &…...

socket 一个完整的不错的示例

从客户端向服务器端发送信息时&#xff0c;在服务器端有打印显示&#xff1b; 检测环境常用&#xff0c;备份一下 0&#xff0c;公共头文件代码 //config.h#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/socket.h> #inc…...

第10关:基数排序

任务要求参考答案问答98 任务描述相关知识 基数排序算法编程要求测试说明 任务描述 本关任务&#xff1a;实现基数排序算法&#xff0c;并将乱序数列变成升序。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.基数排序算法。 基数排序算法 基数排序是按…...

torch::和at:: factory function的差別

torch::和at:: factory function的差別 前言torch::autograd::THPVariable_randtorch::rand_symintat::rand_symintdemotorch命名空間at命名空間 前言 >>> import torch >>> a torch.rand(3, 4) >>> a.requires_grad False >>> a torch…...

与珎同行录-开篇-231129

与珎同行录-开篇 珎就是对陪伴并帮助我写代码的AI的昵称 能不能读懂这个绕口令问题呢? 连续的椎体的相邻椎体质心的相邻质心的质心作为当前质心所在的椎体的质心, 该质心的方向代表该椎体的上下方向 如何代码实现呢? 还是没看懂…好吧最终的算法是:...

linux logrotate日志轮询设置案例一

1.编辑/etc/logrotate.conf文件&#xff0c;添加如下配置&#xff0c;并保存 /var/log/ztj.log {missingokhourlycreate 644 root rootsharedscriptspostrotateif [ -f /var/run/syslogd.pid ];then/bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) >/dev/null 2>&…...

Android 12.0 禁用adb reboot recovery命令实现正常重启功能

1.前言 在12.0的系统rom定制化开发中,在定制recovery模块的时候,由于产品开发需要要求禁用recovery的相关功能,比如在通过adb命令的 adb reboot recovery的方式进入recovery也需要实现禁用,所以就需要了解相关进入recovery流程来禁用该功能 2.禁用adb reboot recovery命令…...

别再只画静态图了!用Qt QChart实现可交互波形图的5个高级技巧

别再只画静态图了&#xff01;用Qt QChart实现可交互波形图的5个高级技巧 在数据可视化领域&#xff0c;静态图表已经无法满足现代应用对用户体验的严苛要求。想象一下&#xff0c;当用户面对一个温度监测系统时&#xff0c;如果只能被动地观看一条固定不变的曲线&#xff0c;而…...

MARVELL迈威 88E1112-C2-NNC1C000 QFN 以太网收发器

功能特性 SGMII/SERDES MAC侧支持 支持与光纤应用相同的PHY的自动媒体支持 SFP模块支持-铜缆和光纤SFP模块-支持嵌入铜缆SFP模块 额外集成的SERDES可切换至1.25 GHz或125 MHz 高级诊断能力 -Marvell VCT 集成CRC错误检测器、数据包计数器和生成器 小型64引脚QFN封装 仅需两个电…...

从0到1搭建可靠消息链路:RocketMQ重试 + Redis幂等实战

三方消息对接为什么总翻车&#xff1f;一套 RocketMQ Redis 幂等 的工业级解法&#xff08;含架构图伪代码&#xff09; &#x1f525; 适合收藏&#xff1a;三方平台对接、商品/订单同步、消息中台治理 ✅ 你将收获&#xff1a;一套可直接落地的“拉取-发送-消费-重试-幂等-补…...

Claude仅用10分钟发现Apache ActiveMQ潜伏13年的RCE漏洞

Apache ActiveMQ Classic 近日披露了一个存在十多年未被发现的严重远程代码执行&#xff08;RCE&#xff09;漏洞。值得注意的是&#xff0c;这个漏洞并非由人工代码审计发现&#xff0c;而是 Anthropic 公司的 Claude AI 模型在不到 10 分钟内识别出来的。该漏洞编号为 CVE-20…...

SAMD微控制器安全Flash存储库设计与实践

1. 项目概述SAMD_SafeFlashStorage 是一款专为 SAMD21&#xff08;如 Arduino Zero、MKR系列&#xff09;和 SAMD51&#xff08;如 Adafruit Metro M4、Arduino MKR VIDOR 4000&#xff09;微控制器设计的安全型闪存数据存储库。它并非简单复刻&#xff0c;而是对原始 cmaglie/…...

【技术解析】BAN——双线性注意力网络在视觉问答中的高效应用与优化

1. 双线性注意力网络&#xff08;BAN&#xff09;为何能成为视觉问答的利器 视觉问答&#xff08;VQA&#xff09;任务需要同时理解图像内容和自然语言问题&#xff0c;这对模型的跨模态交互能力提出了极高要求。传统协同注意力机制虽然能分别捕捉视觉和文本特征&#xff0c;但…...

代驾软件可以自己改界面吗?

在选择代驾软件时&#xff0c;很多企业主和创业者都非常关心一个问题&#xff1a;代驾软件的界面是否可以自定义&#xff1f; 这个问题的答案是肯定的。本文将详细介绍如何自定义代驾软件的界面&#xff0c;并提供具体的数据和案例支撑&#xff0c;帮助你更好地理解和操作。一、…...

AI Coding越来越强,我们还有必要学Processing吗? · 创意编程陕

故障表现 发现请求集群 demo 入口时卡住&#xff0c;并且对应 Pod 没有新的日志输出 rootce-demo-1:~# kubectl get pods -n deepflow-otel-spring-demo -o wide NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NO…...

当PLC遇上滚筒:聊聊洗衣机控制系统的硬核操作

基于S7-200 PLC组态王组态和触摸屏的洗衣机控制系统的设计 熟悉工业电气控制系统的组成&#xff0c;熟悉PLC系统的设计。 全自动洗衣机能够根据衣物的质地、数量及脏污程度 来实现标准洗涤、柔顺洗涤等多功能模式。 各个功能 模式均包括洗涤、漂洗、排水、脱水等过程&#xff0…...

从GNS3到真实网络:手把手教你用Wireshark抓包分析思科路由协议(OSPF/EIGRP实战)

从GNS3到真实网络&#xff1a;手把手教你用Wireshark抓包分析思科路由协议&#xff08;OSPF/EIGRP实战&#xff09; 在网络工程师的成长道路上&#xff0c;理解路由协议的底层工作原理是突破技术瓶颈的关键一步。而GNS3与Wireshark的组合&#xff0c;就像给网络学习者配备了一台…...