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();}
}

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

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

相关文章

【Linux服务器Java环境搭建】07 在linux中安装MySql,以及对MySQL的配置与远程连接

【Linux服务器Java环境搭建】01购买云服务器以及在服务器中安装Linux系统 【Linux服务器Java环境搭建】02 通过xftp和xshell远程连接云服务器 【Linux服务器Java环境搭建】03 Git工具安装 【Linux服务器Java环境搭建】04 JDK安装&#xff08;JAVA环境安装&#xff09; 【Linux服…

Hadoop学习笔记(HDP)-Part.02 核心组件原理

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

点云从入门到精通技术详解100篇-雨雾环境下多传感器融合 SLAM 方法(续)

目录 4.2.4 边缘化 4.3 激光雷达惯性里程计 4.3.1 点云去畸变 4.3.2 点云特征提取

【漏洞复现】万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞 附POC

漏洞描述 万户ezOFFICE集团版协同平台以工作流程、知识管理、沟通交流和辅助办公四大核心应用 万户ezOFFICE协同管理平台是一个综合信息基础应用平台。 万户协同办公平台ezoffice wpsservlet接口存在任意文件上传漏洞。 免责声明 技术文章仅供参考,任何个人和组织使用网络应…

CETN01 - How to Use Cloud Classroom

文章目录 I. Introduction to Cloud ClassroomII. How to Use Cloud Classroom1. Publish Resources2. Conduct Activities3. Class Teaching Reports4. View Experience Values5. Performance in Cloud Classroom I. 云课堂介绍II. 如何使用云课堂1. 发布资源2. 进行活动3. 班…

007:vue实现与iframe实现页面数据通信

首页先搭建一个html页面和vue页面&#xff0c;在vue页面中&#xff0c;嵌入我们需要的iframe页面 文章目录 1. 搭建 html 页面和 vue 页面2. 实现 iframe 向 vue 页面通信3. 在实现 vue 向 iframe 页面通信 1. 搭建 html 页面和 vue 页面 暂定为 iframeDemo.html 和 vueDemo.v…

python文件操作知识

【一】操作流程&#xff1a; 打开文件&#xff0c;得到一个文件句柄&#xff08;对象&#xff09;&#xff0c;赋给一个对象。通过文件句柄对文件进行操作。关闭文件。 【 二 】 使用方法 open&#xff08;路径 文件名&#xff0c;读写模式&#xff09; 如下&#xff1a; …

MySQL主从复制(一主一从、双主双从)

一、概述 1. 数据库主从概念、优点、用途 主从数据库是什么意思呢&#xff0c;主是主库的意思&#xff0c;从是从库的意思。数据库主库对外提供读写的操作&#xff0c;从库对外提供读的操作。   数据库为什么需要主从架构呢&#xff1f; 高可用&#xff0c;实时灾备&#x…

golang 实现和linephone的功能

要在Go语言中实现类似于 Linphone 的 VoIP 功能&#xff0c;您可以结合使用适用于Go的 SIP 库和 WebRTC 库。以下是一些步骤和示例代码&#xff0c;以便实现一个简单的 VoIP 客户端。 1. 选择 SIP 库: - 在Go语言中&#xff0c;您可以使用 github.com/cloudwebrtc/sip 等SI…

MQTT框架和使用

目录 MQTT框架 1. MQTT概述 1.1 形象地理解三个角色 1.2 消息的传递 2. 在Windows上体验MQTT 2.1 安装APP 2.2 启动服务器 2.3 使用MQTTX 2.3.1 建立连接 2.3.2 订阅主题 2.3.3 发布主题 2.4 使用mosquitto 2.4.1 发布消息 2.4.2 订阅消息 3. kawaii-mqtt源码分析…

直面多云困境,聊聊F5分布式云的破局之道

在数字化浪潮的大背景下&#xff0c;我们迎来了一个万物上云的时代。Gartner的调查数据显示&#xff0c;81%的公有云用户选择两个或两个以上的云服务供应商。对企业来说&#xff0c;充分利用多云网络可以实现业务的成功转型和增长。然而机遇与挑战并存&#xff0c;本文从多云网…

使用AWS Glue与AWS Kinesis构建的流式ETL作业(二)——数据处理

大纲 2 数据处理2.1 架构2.2 AWS Glue连接和创建2.2.1 创建AWS RedShift连接2.2.2 创建AWS RDS连接&#xff08;以PG为例&#xff09; 2.3 创建AWS Glue Job2.4 编写脚本2.4.1 以AWS RedShift为例2.4.2 以PG为例 2.5 运行脚本 2 数据处理 2.1 架构 2.2 AWS Glue连接和创建 下…

C++基础 -42- STL库之list链表

list链表的格式(需要定义头文件) list<int> data1(4, 100);list<int> data2(4, 500);list链表的合并接口 举例使用合并接口并且验证 data2.merge(data1);list<int>::iterator ccc;for (ccc data2.begin(); ccc ! data2.end(); ccc){cout << *ccc …

算法学习系列(五):N皇后、数独

目录 引言一、N皇后问题代码实现测试 二、数独问题代码实现测试 引言 这个N皇后问题是很典型的一个递归问题&#xff0c;就是还是要掌握&#xff0c;所谓递归其实就是dfs&#xff0c;一层一层深入下去。数独和N皇后的思路是一样的&#xff0c;只不过一些细节不同而已。 一、N…

TFIDF、BM25、编辑距离、倒排索引

TFIDF TF刻画了词语t对某篇文档的重要性&#xff0c;IDF刻画了词语t对整个文档集的重要性

2024年API安全趋势预测

目录 1.API漏洞的渗透性 2.标准框架的局限性 3.防止漏洞 4.不断上升的威胁和战略建议 案例分析 2024年的潜在威胁 驾驭不断演变的API安全格局 在接下来的部分中&#xff0c;我们将更深入地研究这些趋势&#xff0c;探索标准框架在应对这些新出现的威胁方面的局限性…

数据库学习日常案例20231203-Mysql高级 -- 日志管理篇

Mysql高级 -- 日志篇 *日志类型 1.mysql的6类日志&#xff1a; 2.日志的弊端 *慢查询日志(slow query log) *通用查询日志(general query log) 1.作用&#xff1a; 2.问题场景&#xff1a; 3.查看当前状态 &#xff1a; 4.启动日志&#xff1a; 方式1&#xff1a;永久…

【GO】记一次排查 docker virtual size 过大问题

起因 运维反馈给我&#xff0c;我的容器 docker virtual size 过大&#xff0c;就没听过这个东西。 使用 docker ps -s 会发现比 docker ps 要多点东西&#xff0c;最后一栏的 size。这个 size 是镜像大小加上你写到运行容器里面文件的大小。 问题排查 容器内服务对落盘文件…

云计算在数字营销中的作用是什么?

营销策略和云计算是一个为企业提供多种优势的系统。它使他们能够取得更大的成功&#xff0c;同时提高产量。这样做的原因是&#xff0c;可以从任何位置远程使用云集成工具和应用程序。基本上&#xff0c;该系统增强了存储设备和传播。同时&#xff0c;它减轻了公司 IT 网络的压…

【Kubernetes】可视化UI界面Dashboard

安装和配置k8s可视化UI界面 一、安装Dashboard1.1、上传镜像并解压1.2、安装dashboard组件1.3、修改service1.4、访问dashboard 二、通过Token令牌访问Dashboard2.1、创建clusterrolebinding2.2、获取token2.3、使用token登录 三、通过kubeconfig文件访问Dashboard3.1、创建clu…