Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理
文章目录
- Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理
- 结论
- 1 java异常体系
- 2 Spring框架异常处理
- 3 定位Spring框架转化为哪种unchecked异常
- 3.1 捕获RuntimeException定位Spring框架转化抛出的异常类
- 3.2 进一步查看包名判断
- 3.3 识别MyBatisSystemException下级实现
- 3.3 识别MyBatisSystemException继承实现
Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理
结论
在全局异常处理类中添加MyBatisSystemException即可单独对MyBatis中和数据库操作相关异常操作进行全局处理,同时屏蔽sql内容,只返回文字 “服务错误,请联系系统管理员” 给前端。
@Slf4j
@ControllerAdvice
public class ExceptionHandlerAdvice {/*** Sql查询失败在spring的包装下会统一抛出非受检异常,单独捕获,防止sql语句被返回给前端*/@ResponseBody@ExceptionHandler(MyBatisSystemException.class)public Object handleBindException(HttpServletRequest req, MyBatisSystemException e) {String path = "http://"+req.getRemoteAddr()+":"+req.getServerPort() + req.getRequestURI();log.error("访问 "+path +"报错,报错信息为: "+ e.getMessage(), e);return new BaseResult<>(CodeEnum.E500, false, "服务错误,请联系系统管理员。");}//拦截所有Exception,展示Error页面@ResponseBody@ExceptionHandler({Exception.class})public BaseResult errorHandler(HttpServletRequest req, Exception e) {String path = "http://"+req.getRemoteAddr()+":"+req.getServerPort() + req.getRequestURI();log.error("访问 "+path +"报错,报错信息为: "+ e.getMessage(), e);return new BaseResult<>(CodeEnum.E500, false, e.getMessage());}
}
1 java异常体系
1.Throwable
所有的异常都是Throwable的直接或者间接子类。Throwable有两个直接子类,Error和Exception。
2.Error
Error是错误,对于所有的编译时期的错误以及系统错误都是通过Error抛出的。这些错误表示故障发生于虚拟机自身、或者发生在虚拟机试图执行应用时,如Java虚拟机运行错误(Virtual MachineError)、类定义错误(NoClassDefFoundError)等。这些错误是不可查的,因为它们在应用程序的控制和处理能力之 外,而且绝大多数是程序运行时不允许出现的状况。对于设计合理的应用程序来说,即使确实发生了错误,本质上也不应该试图去处理它所引起的异常状况。在 Java中,错误通过Error的子类描述。
3.Exception
它规定的异常是程序本身可以处理的异常。异常和错误的区别是,异常是可以被处理的,而错误是没法处理的。
4.Checked Exception【受检异常】
可检查的异常,这是编码时非常常用的,所有checked exception都是需要在代码中处理的。它们的发生是可以预测的,正常的一种情况,可以合理的处理。例如IOException。
5.Unchecked Exception【非受检异常】
RuntimeException及其子类都是unchecked exception。比如NPE空指针异常,除数为0的算数异常ArithmeticException等等,这种异常是运行时发生,无法预先捕捉处理的。Error也是unchecked exception,也是无法预先处理的。
参考:https://juejin.cn/post/6965407291260534820
2 Spring框架异常处理
Spring 提供方便的 API 把具体技术相关的异常(比如由JDBOHibernate or JDO 抛出的)转化为一致的 unchecked 异常。
3 定位Spring框架转化为哪种unchecked异常
3.1 捕获RuntimeException定位Spring框架转化抛出的异常类
直接在ExceptionHandlerAdvice中捕获RuntimeException,然后DEBUG,查看异常class类型,发现都是继承自MyBatisSystemException
3.2 进一步查看包名判断
进一步查看包名发现为org.springframework.dao,基本可以判定捕获MyBatisSystemException可以实现要求
package org.mybatis.spring;import org.springframework.dao.UncategorizedDataAccessException;public class MyBatisSystemException extends UncategorizedDataAccessException {private static final long serialVersionUID = -5284728621670758939L;public MyBatisSystemException(Throwable cause) {super((String)null, cause);}
}
3.3 识别MyBatisSystemException下级实现
MyBatisSystemException目前没有下级实现类
3.3 识别MyBatisSystemException继承实现
可以看到继承父类均为abstract修饰,一直到NestedRuntimeException继承RuntimeException。则已经找到MyBatisSystemException的所有上级继承父类,进一步确认MyBatisSystemException符合作为全局异常捕获ExceptionHandler的最上级实现异常类型,而不会漏异常捕获。
package org.springframework.dao;import org.springframework.lang.Nullable;public abstract class UncategorizedDataAccessException extends NonTransientDataAccessException {public UncategorizedDataAccessException(@Nullable String msg, @Nullable Throwable cause) {super(msg, cause);}
}
package org.springframework.dao;import org.springframework.lang.Nullable;public abstract class NonTransientDataAccessException extends DataAccessException {public NonTransientDataAccessException(String msg) {super(msg);}public NonTransientDataAccessException(@Nullable String msg, @Nullable Throwable cause) {super(msg, cause);}
}
package org.springframework.dao;import org.springframework.core.NestedRuntimeException;
import org.springframework.lang.Nullable;public abstract class DataAccessException extends NestedRuntimeException {public DataAccessException(String msg) {super(msg);}public DataAccessException(@Nullable String msg, @Nullable Throwable cause) {super(msg, cause);}
}
package org.springframework.core;import org.springframework.lang.Nullable;public abstract class NestedRuntimeException extends RuntimeException {private static final long serialVersionUID = 5439915454935047936L;public NestedRuntimeException(String msg) {super(msg);}public NestedRuntimeException(@Nullable String msg, @Nullable Throwable cause) {super(msg, cause);}@Nullablepublic String getMessage() {return NestedExceptionUtils.buildMessage(super.getMessage(), this.getCause());}@Nullablepublic Throwable getRootCause() {return NestedExceptionUtils.getRootCause(this);}public Throwable getMostSpecificCause() {Throwable rootCause = this.getRootCause();return (Throwable)(rootCause != null ? rootCause : this);}public boolean contains(@Nullable Class<?> exType) {if (exType == null) {return false;} else if (exType.isInstance(this)) {return true;} else {Throwable cause = this.getCause();if (cause == this) {return false;} else if (cause instanceof NestedRuntimeException) {return ((NestedRuntimeException)cause).contains(exType);} else {while(cause != null) {if (exType.isInstance(cause)) {return true;}if (cause.getCause() == cause) {break;}cause = cause.getCause();}return false;}}}static {NestedExceptionUtils.class.getName();}
}}cause = cause.getCause();}return false;}}}static {NestedExceptionUtils.class.getName();}
}
相关文章:
Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理
文章目录 Mabatis处理异常屏蔽SQL返回前端全局异常捕获处理结论1 java异常体系2 Spring框架异常处理3 定位Spring框架转化为哪种unchecked异常3.1 捕获RuntimeException定位Spring框架转化抛出的异常类3.2 进一步查看包名判断3.3 识别MyBatisSystemException下级实现3.3 识别My…...
黑豹程序员-java发邮件,发送内容支持html,带多附件的案例
介绍 发邮件mail是常见的软件功能,下面利于spring和java的mail库实现发送内容支持html,带多附件的案例 开启SMTP邮件发送协议 谁提供的SMTP邮件服务,就找谁开启。QQ邮箱类似。 依赖 <!--Java MAil 发送邮件API--><dependency&g…...
[LeetCode] 15. 三数之和
15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意:**答案中不可以包含重复…...
Android Chips(标签)
目录 一、流式布局标签发展历程 二、类型及使用 2.1 Chip.Action(默认值) 2.2 Chip.Entry 2.3 Chip.Filter 2.4 Chip.Choice 三、常用事件 3.1 OnClickListener 3.2 OnCheckedChangeListener 3.3 OnCloseIconClickListener 四、ChipGroup 4.1 ChipGroup Chip.Choi…...
飞行汽车开发原理(上)
前言 小节的安排是由浅入深,要按顺序读;有电路知识基础的同学可跳到“计算机电路”一节开始。因为知识点之间有网状依赖,没办法按分类来讲。 为了避免过于深入、越讲越懵,很多描述仅为方便理解、不求严谨。 半导体特性 导体&a…...
22、pytest多个参数化的组合
官方实例 # content of test_multi_parametrie.py import pytestpytest.mark.parametrize("x",[0,1]) pytest.mark.parametrize("y",[2,3]) def test_foo(x,y):print("{}-{}".format(x,y))pass解读与实操 要获得多个参数化参数的所有组合&…...
【网络奇缘】- 如何自己动手做一个五类|以太网|RJ45|网络电缆
🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 本篇文章关于计算机网络的动手小实验---如何自己动手做一个网线, 也是为后面的物理层学习进…...
【从零开始学习JVM | 第三篇】类的生命周期(高频面试)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。 在本文中,我们将深入探讨类的生命周期,从类加载到…...
详解前后端交互时PO,DTO,VO模型类的应用场景
前后端交互时的数据传输模型 前后端交互流程 前后端交互的流程: 前端与后端开发人员之间主要依据接口进行开发 前端通过Http协议请求后端服务提供的接口后端服务的控制层Controller接收前端的请求Contorller层调用Service层进行业务处理Service层调用Dao持久层对数据持久化 …...
力扣295. 数据流的中位数
优先队列 思路: 中位数是排序中间的数值:S1.M.S2可以使用两个优先队列来存放两边的数值,总是使得左侧的堆顶是最大的,右侧的堆顶是最小的,即使用大顶堆存放 S1,使用小顶堆存放S2,使得两个队列的…...
英语二笔记
完型填空 20题/0.5分 总分10, 至少拿8分 阅读理解A 20题/2分 总分40 至少拿24分 阅读理解B 5题/2分 总分10 至少拿6分 短文翻译 1题/15分 …...
【OpenSSH升级】升级后证书认证登录突然失效
上一篇“【OpenSSH升级】无论密码输入正确与否总是登录失败(error: Could not get shadow information for root)”总结了CentOS7上的openssh从7.4升级到9.4之后,密码认证失败问题,这里再总结一下证书认证失效问题。 大多数情况下…...
pytest +uiautomator2+weditor app自动化从零开始
目录结构1.0 把设备连接单独移出去了 模块操作代码,有一些流程操作和断言方法 from devices import dv from time import sleep import random from tool.jt import capture_screenshotdef initialization(func):def wrapper():sleep(1)dv.app_stop(com.visteon.…...
【计算机网络笔记】物理层——信道与信道容量
系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…...
深度学习火车票识别系统 计算机竞赛
文章目录 0 前言1 课题意义课题难点: 2 实现方法2.1 图像预处理2.2 字符分割2.3 字符识别部分实现代码 3 实现效果4 最后 0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 图像识别 火车票识别系统 该项目较为新颖,适…...
C++EasyX之井字棋
视频链接 井字棋 用EasyX和C实现井字棋小游戏 源码及注释 #include<graphics.h>char board_data[3][3] {{-,-,-},{-,-,-},{-,-,-}, };char current_piece O;//检测指定棋子的玩家是否获胜 bool CheckWin(char c) {// 检查每一行for (int i 0; i < 3; i){if (bo…...
12.5_黑马数据结构与算法Java
目录 001 二分查找 算法描述 002 二分查找 算法实现 003 二分查找 问题1 循环条件 004 二分查找 问题2 中间索引 thinking:反码补码原码? thinking:二进制转十进制? thinking:无符号右移? 005 二分…...
【PID学习笔记 5 】控制系统的性能指标之一
写在前面 PID在实际工程中最重要的工作就是调参,那么首先就要了解控制系统的性能指标。上文最后简要介绍了控制系统的基本要求,本文开始将系统学习控制系统的性能指标,内容比较多,初步计划是分三节来讲解。本文重点介绍性能指标的…...
HarmonyOS学习--TypeScript语言学习(三)
本章目录如下 一、条件语句 二、迭代器 三、循环 四、函数 五、类 一、条件语句 条件语句用于基于不同的条件来执行不同的动作。TypeScript 条件语句是通过一条或多条语句的执行结果(True 或 False)来决定执行的代码块。 在 TypeScript 中&#x…...
Matlab 镜像变换(2D)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 镜像变换是一个非常有趣的过程,它有着一个通用的套路(以2D为例):一个点围绕一个给定对称轴的镜像可以通过平移对称轴上一点,然后旋转它,使对称轴与x轴对齐,之后我们将旋转后的点的y坐标置为负,最后再将对称…...
SpringBoot3-快速体验
1、pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...
计数问题(数位DP)
题目大意:给定一个区间,求该区间内0 ~ 9出现的次数,多次询问,以0 0结束询问 测试用例: 输入: 1 10 44 497 346 542 1199 1748 1496 1403 1004 503 1714 190 1317 854 1976 494 1001 1960 0 0 输出ÿ…...
SQL Server事务(Transaction)
5. 事务(Transaction) 5.1. 事务概念 事务是关系库中不可分割的一系列数据库操作,这些操作必须要么整体成功,要么整体失败。事务维护数据完整性,保证数据库总是处于一致性状态。虽然,各关系库中事务实现和操作的具体细节有所不同,但基本概念和功能完全相同,而具体操作…...
Python语言基础学习大纲(由某大模型生成)
自从上次经丙察察游了一次滇藏线,已有3个没写一篇了。今天利用由某大模型生成的上面这张思维导图,配合这个大模型生成的6000多字拼凑出一篇博文聊以交差。 Python语言概述 一、语言特点 1.语法简单明了 Python的语法简洁易懂,使得编写代码…...
nodejs+vue+微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐
本项目主要分为前台模块与后台模块2个部分,详细描述如下: (1)前台模块 首页: 首页可以起到导航的作用,用户想要了解网站 ,网站首页为用户可以深入了解网站提供了一个平台,它就向一个“导游”…...
工业机器视觉megauging(向光有光)使用说明书(十二,轻量级的visionpro)
关于最后一个工具的介绍:就是这个“相机图像” 我们可以鼠标双击点进去看一看: 在图像上点击,就可以截取一块图像,是可以放大缩小的,这个放大很low,是我以前研究缩放入门时的版本,本想删除&…...
HarmonyOS学习--了解基本工程目录
1.工程级目录 工程的目录结构如下: 其中详细如下: AppScope中存放应用全局所需要的资源文件。entry是应用的主模块,存放HarmonyOS应用的代码、资源等。oh_modules是工程的依赖包,存放工程依赖的源文件。build-profile.json5是工…...
JRT导出协议实现
之前实现了JRT的打印客户端实现,这次实现JRT的导出Excel的客户端实现,这样这套框架就成为完全体了。还是一样的设计,不面向具体业务编程,我喜欢面向协议编程,导出一样定义了一套协议。 协议约定: 然后就是…...
Unity中动态合批
文章目录 前言一、动态合批的规则1、材质相同是合批的前提,但是如果是材质实例的话,则一样无法合批。2、支持不同网格的合批3、动态合批需要网格支持的顶点条件二、我们导入一个模型并且制作一个Shader,来测试动态合批1、我们选择模型的 Mesh…...
逆水行舟!浅谈24届双非本科秋招
逆水行舟!浅谈24届双非本科的秋招 逆水行舟!浅谈24届双非本科的秋招0、背景 -- 写下本文的初衷1、实习 -- 秋招的预备战役1.1 科大讯飞1.2 三七互娱 2、秋招 -- 一场没有硝烟的战争3、总结 -- 做好自己想做的事情 0、背景 – 写下本文的初衷 如题&#…...
网站布局设计理由/牡丹江seo
这篇文章要介绍的内容是,使用urllib和Json库,通过post向浏览器发送数据,从而实现利用Python就可以使用爬虫网站的特定功能:我们这篇的实例是向《有道翻译》中发送数据,并自动给出翻译。如下图1所示: 图1首…...
河北住房和城乡建设厅官方网站/关键词点击价格查询
作者:Baijayanta Roy来源:towardsdatascience编译&内容补充:早起Python在用python进行机器学习或者日常的数据处理中,pandas是最常用的Python库之一,熟练掌握pandas是每一个数据科学家的必备技能,本文将…...
钢琴网站建设原则/许昌网络推广外包
本文档以实战的形式介绍系统如何禁用 IPV6, 使用的操纵系统是 RHEL7.3更改/etc/sysctl.conf配置文件[rootJaking vsftpd]# vim /etc/sysctl.conf# sysctl settings are defined through files in# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.## Vendors settings…...
河北做网站找谁/网络推广公司联系方式
jvm参数配置解析 参数说明-Xmx2048M JVM最大堆内存 -Xms2048M JVM最初始堆内存 -Xmn256MJVM年轻代大小(整个堆大小年轻代大小 年老代大小 持久代大小 。持久代一般固定大小为64m)-XX:MaxMetaspaceSize256MMaxMetaspaceSize是没有上限的,最…...
佛山模板网站建设/免费培训seo
Scrum是一种迭代式增量软件开发过程,通常用于敏捷软件开发。Scrum在英语的意思是橄榄球里的争球虽然Scrum是为管理软件开发项目而开发的,它同样可以用于运行软件维护团队,或者作为计划管理方法 Scrum定义了许多角色,根据猪和鸡的笑话分为两组…...
python做网站性能怎么样/广东企业网站seo报价
2019独角兽企业重金招聘Python工程师标准>>> <1>CALayer简介 1、CALayer一般作为UIView的容器而使用。 2、CALayer是一个管理者图片载体(image-based content)的层结构 3、直接修改单独创建出的CALayer的属性可以触发隐式动…...