全局异常处理--Java实战项目篇

news2024/9/20 5:41:32

系列文章目录

Java后端开发功能模块思路
Spring Boot自动配置–如何切换内置Web服务器
Spring Boot读取配置文件内容的三种方式
该系列文章持续更新,更多的文章请点击我的主页查看哦!


文章目录

  • 系列文章目录
  • 前言
  • 一、出现的问题
  • 二、解决问题的方法
    • 1. 添加前先查询(不推荐)
    • 2. 抛出局部异常(不推荐)
    • 3.全局异常处理 (推荐)
  • 三、解决问题
  • 四、效果展示
  • 五、全部代码
  • 总结


前言

在我们开发项目的过程中难免会遇到要抛出异常,对异常进行处理。该文章我们就来聊聊全局异常处理该怎么做,以及代码如何实现。我们这里用添加员工功能模块的代码来引出问题。一步步的发现问题和解决问题。


一、出现的问题

在我们做添加操作时,如果输入的名称(就像游戏名一样,表的该字段设置为唯一的),如果该名称我们现在数据库表中已经有了这样的名称,那么在做添加操作时就会抛出SQL异常。
如下图所示:意思是“xiaoming”这个在数据库中已存在,并且该字段为唯一字段。所以在添加就添加不进去了,抛出异常。
在这里插入图片描述

二、解决问题的方法

1. 添加前先查询(不推荐)

什么是添加前先查询呢?有经验的小伙伴就会想到说:在添加的数据传给服务端后,要先进行对于要添加名称的查询,如果查询的数据库表中有该名称就返回“添加失败”,没有该名称就在执行添加的SQL语句添加到数据库表中。

首先这是可行的操作,也不会在出现什么异常。但是忽略了一个关键的性能问题,如果使用上述说的去编写代码,我们会先查询、后添加。访问2次数据库,对于性能来说是及其不推荐的写法。

2. 抛出局部异常(不推荐)

抛出局部异常,就是在该执行SQL语句上添加try、catch来捕获异常进行抛出。这下就只用执行一次SQL,性能问题上没有什么变化了吧!

但只抛出一个异常还好,如果这类异常情况多了呢,就会出现大量的try、catch来进行异常处理。这样也不是我们想要的。所以我们来看第三种全局异常处理。

3.全局异常处理 (推荐)

全局异常处理就没有了上述的弊端,实现优雅的方式编写代码。代码的可读性也会变高。

三、解决问题

所以我们用全局异常处理解决问题。首先在包下创建一个GlobalExceptionHandler的实现类,在类上添加@ControllerAdvice注解,注解里面使用annotations来确定异常抛出的范围,意思就是哪些类下有异常时会执行该类。

代码如下:

@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j

上述代码就是将所有以Controller、RestController注解的类抛出的异常都会执行该类进行异常处理。

然后就是编写一个exceptionHandler方法,方法上加注解表示什么类型的异常会执行该方法。这里的话就是SQL异常。里面的异常就是第一张图红色框内的异常信息。函数的参数也是该异常信息。

代码如下:

//抛出SQL异常信息
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        //异常处理
    return R.error("添加员工失败");
    }

最后就是对这样的异常进行处理逻辑的编写。
首先我们要找到异常中带有Duplicate entry这类异常进行处理。(图一红色框内,英文表示已有该数据,没法添加。)只有这种异常我们才会处理。

代码如下:

//异常中带有Duplicate entry这类异常进行处理
        if(ex.getMessage().contains("Duplicate entry")){
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            return R.error(msg);
        }

上述代码表示如果是该类异常,我们会向前端返回异常【“xiaoming”已存在】。

四、效果展示

我们运行程序,在账号已存在的情况下在进行添加就会抛出【“xiaoming”已存在】。
如下图所示:
在这里插入图片描述

五、全部代码

上述的讲解代码是分开的,现在将所有的代码都发上来。供大家参考运用~

/**
 * 全局异常处理
 * */
@ControllerAdvice(annotations = {RestController.class, Controller.class})
@ResponseBody
@Slf4j
public class GlobalExceptionHandler {
    //抛出SQL异常信息
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public R<String> exceptionHandler(SQLIntegrityConstraintViolationException ex){
        //异常中带有Duplicate entry这类异常进行处理
        if(ex.getMessage().contains("Duplicate entry")){
            String[] split = ex.getMessage().split(" ");
            String msg = split[2] + "已存在";
            return R.error(msg);
        }
    return R.error("添加员工失败");
    }
}

总结

全局异常处理是一个很好的方法,可以用来解决这样类似的问题。代码量也不多,大家理解在实际写项目练习时运用上是非常不错的。本篇内容就说到这里,大家如果有什么问题欢迎私信我一起讨论~
如果对这方面的文章该兴趣可以查看我的主页哦~

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

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

相关文章

iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?

在升级最新的 iOS 16.3 系统后&#xff0c;有些用户可能遇到了个别应用无法正常打开&#xff0c;卡死的异常情况。大家可以尝试通过如下方式解决问题。 1.重新启动应用&#xff1a; 如果应用出现卡死或闪退&#xff0c;可从 iPhone 屏幕由底往上滑&#xff08;或连续按两次 H…

Java变量和数据类型,超详细整理,适合新手入门

目录 一、什么是变量&#xff1f; 二、变量 变量值互换 三、基本数据类型 1、八种基本数据类型 2、布尔值 3、字符串 四、从控制台输入 一、什么是变量&#xff1f; 变量是一种存储值的容器&#xff0c;它可以在程序的不同部分之间共享&#xff1b;变量可以存储数字、字…

C语言进阶——通讯录模拟实现

&#x1f307;个人主页&#xff1a;_麦麦_ &#x1f4da;今日名言&#xff1a;只有走在路上&#xff0c;才能摆脱局限&#xff0c;摆脱执着&#xff0c;让所有的选择&#xff0c;探寻&#xff0c;猜测&#xff0c;想象都生机勃勃。——余秋雨《文化苦旅》 目录 一、前言 二、正…

让我百思不得其解的infer究竟是怎么推导类型的?

情景再现 有这么一个条件类型的基本语法: T extends U ? X : Y; 如果占位符类型U是一个可以被分解成几个部分的类型&#xff0c;譬如数组类型&#xff0c;元组类型&#xff0c;函数类型&#xff0c;字符串字面量类型等。这时候就可以通过infer来获取U类型中某个部分的类型。 …

95后外贸SOHO,年入7位数,他究竟是怎么做的?

外贸SOHO&#xff0c;一年到底能挣多少钱&#xff1f;有人说&#xff1a;“勤勤恳恳&#xff0c;年薪也就十来万吧”&#xff1b;也有人说&#xff1a;“100万而已我早就已经挣到了”&#xff1b;还有人说&#xff1a;“谁说新手难出头&#xff1f;我做跨境半年赚200万&#xf…

Linux设备驱动移植

目录 一、设备树 1.1设备树 1.2设备树文件 1.3设备树语法 1.4Linux内核驱动移植 二、网卡驱动 2.1在make menuconfig界面中选中要安装的驱动 2.2在设备树中添加/修改相应的设备信息 2.3修改时钟 2.4修改eMMc 2.5编译测试 一、设备树 1.1设备树 设备树是一种描述硬…

MATLAB 粒子群算法

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Cy5 Alkyne,1223357-57-0,花青素Cyanine5炔基,氰基5炔烃

CAS号&#xff1a;1223357-57-0 | 英文名&#xff1a; Cyanine5 alkyne&#xff0c;Cy5 Alkyne | 中文名&#xff1a;花青素CY5炔基CASNumber&#xff1a;1223357-57-0Molecular formula&#xff1a;C35H42ClN3OMolecular weight&#xff1a;556.19Purity&#xff1a;95%Appear…

全网详解MyBatis-Plus updateById方法更新不了空字符串或null的解决方法

文章目录1. 文章引言2. 分析问题3. 解决问题3.1 方法1&#xff1a;全局配置方式3.2 方法2&#xff1a;非null字段验证策略3.3 方法3&#xff1a;通过注解的方式4. 总结1. 文章引言 在开发的过程中&#xff0c;我们经常使用MyBatis-Plus的updateById方法更新数据表&#xff0c;…

ChatGPT学习心得一(使用node+react做了一个案例)

项目地址 http://chat.xutongbao.top 项目截图 使用技术栈 nodeSQLiteredisnginxlog4jsexpressjenkinscdnreactantdreact-scrollbars-customiconfontwebpackpostmanaxiosreduximmutablenpmyarnopenai等等 官网 https://openai.com/blog/chatgpt/ 官方聊天应用 https://ch…

【Linux】多线程编程 - 同步/条件变量/信号量

目录 一.线程同步 1.什么是线程同步 2.为什么需要线程同步 3.如何实现线程同步 二.条件变量 1.常见接口以及使用 2.wiat/signal中的第二个参数mutex的意义 3.代码验证 三.POSIX信号量 1.概念 2.常见接口以及使用 四.条件变量vsPOSIX信号量 一.线程同步 1.什么是线…

公链“私”用

发表时间&#xff1a;2022年3月17日 信息来源&#xff1a;bsvblockchain.org 虽然区块链行业已经诞生了十多年&#xff0c;但直到最近几年这个行业才开始走向专业化并日趋成熟&#xff0c;现在它已成为了一种可为企业实用范例提供合法解决方案的技术。 早年间&#xff0c;与这…

基于ubuntu20.4的wine的MDK5软件的安装

本文基于ubuntu20.4安装MDK5的keil软件&#xff0c;由于MDK不提供linux版本的安装软件&#xff0c;因此需要利用wine软件来安装MDK5软件&#xff0c;具体流程包括wine软件安装、MDK5安装及MDK5的lic添加等3部分内容。具体流程如下所示&#xff1a; &#xff08;一&#xff09;…

typescript 路径别名问题(别名设置 开发与打包时路径问题)

在使用TS开发时&#xff0c;一般我们会在tsconfig 中设置别名来让代码变得优雅一点。 将 import xx from …/…/…/service/改为import xx form ‘service/’ tsconfig 别名设置 此时项目结构如下 一般我们可以通过baseUrl 和path两个字段来设置对应的别名 {"include…

爬虫:栖落的电影网站,利用requests和re模块

这是栖落的电影网站地址&#xff1a;https://xxx.xxx 进入网页&#xff0c;显示&#xff1a; 爬取目标&#xff1a;电影的名称、观影人数和评分。 易知本网站的url url "https://xxx.xxx" 本网站会识别出headers中的python请求而拒绝访问&#xff0c;所以需要更改…

企业管理者不得不看!现在的大企业都是怎么做文档管理的?

最近有一位朋友问我&#xff1a;“如果是大型企业&#xff0c;文档该怎么管理&#xff1f;” 说实话&#xff0c;很多内部的CIO、CTO对这个问题都是束手无策。信息文件散乱、难以和内部的组织构架关联起来、查找困难、不同版本更新进度不一&#xff0c;确实存在一些管理上的难题…

【DSP视频教程】第11期:插补算法,曲线拟合丝滑顺畅,统计函数和基础函数加速实现,汇集SIMD,饱和和MAC乘累加应用实战(2023-02-12)

视频教程汇总帖&#xff1a;https://www.armbbs.cn/forum.php?modviewthread&tid110519 DSP视频教程有段时间没有更新了。 当前DSP库从CMSIS软件包里面独立出来&#xff0c;并且更新非常频繁&#xff0c;所以本期视频教程优先给大家简单介绍下新版DSP&#xff0c; 然后为…

物流运输管理系统源码:实现物流公司全链条管理

一套适用于物流公司的物流运输管理系统&#xff0c;涵盖物流公司内部从订单->提货->运单->配车->点到->预约->签收->回单->代收货款的全链条管理系统。 运行环境&#xff1a;Windows.NET4.0SQLSERVER2008R2 私信了解更多&#xff01; 菜单功能&#…

灰色关联分析法详解及python实践

1. 关于灰色关联分析 1.1. 什么是灰色关联分析 灰色关联分析是指对一个系统发展变化态势的定量描述和比较的方法&#xff0c;其基本思想是通过确定参考数据列和若干个比较数据列的几何形状相似程度来判断其联系是否紧密&#xff0c;它反映了曲线间的关联程度。 在系统发展过…

亚马逊云科技携手滴普科技,打造数据智能新标杆

随着企业数字化转型的不断深入&#xff0c;数据对于业务的价值和重要性也逐渐凸显。越来越多企业意识到&#xff0c;只有不断提升底层数据基础平台的性能和能力&#xff0c;才能构建数据驱动的业务&#xff0c;增强企业核心竞争力。作为湖仓一体数据智能基础软件独角兽企业&…