108 老生常谈的异常被“吞掉“

2024-03-19 14:52
文章标签 异常 108 吞掉 老生常谈

本文主要是介绍108 老生常谈的异常被“吞掉“,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

这是一个很经典的也经常出现的问题了, 代码里面 发生了异常, 但是 异常被吞掉了, 然后 你可能就回感觉到 很莫名其妙 

就好比 我现在有一个 Service.doBiz 是加了事务的, 然后里面抛出了异常, 但是 在Service.doBiz的调用方处理了这个异常, 并且没有在日志中体现 

然后出现的问题就是, 你会发现 Service.doBiz 莫名其妙的回滚了, 但是 你有不知道异常是什么, 特别是 可以看一下我这里的情况 

呵呵 这是一个老生常谈的问题了, 但是 我这次碰到了, 并且 还懵了我 几分钟, 呵呵 当时特意打了一个 todo, 说是要记录一下  

 

 

测试用例

/*** Test18TryFinally** @author Jerry.X.He <970655147@qq.com>* @version 1.0* @date 2020-12-19 16:51*/
public class Test18TryFinally {// Test18TryFinallypublic static void main(String[] args) {doWithRecord((arg) -> {txExecute(innerArg -> {try {String usernameLike = "jerry";String sqlTemplate = " select * from user where username like '%s' or name like '%s' ";String str = String.format(sqlTemplate, usernameLike);System.out.println(" doQuery for : " + str);
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    throw e;} finally {doSilently(" finally ");}});});}public static void txExecute(Consumer<Void> func) {try {func.accept(null);} catch (Exception e) {System.err.println(" tx rollback ");throw e;}}/*** doWithRecord** @param func func* @return void* @author Jerry.X.He* @date 2020-12-19 17:10*/public static void doWithRecord(Consumer<Void> func) {AtomicBoolean record = new AtomicBoolean(true);try {func.accept(null);} catch (Exception e) {record.set(false);// record error message } finally {doSilently(" doSaveRecord : " + record);}}/*** 相关从日志里面 日志看不到的东西** @param args args* @return void* @author Jerry.X.He* @date 2020-12-20 11:13*/public static void doSilently(String args) {// doSilentlySystem.setOut(new PrintStream(new NullOutputStream()));System.out.println(args);}}

 

用例效果大致如下 

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTEwMzkzMzI=,size_16,color_FFFFFF,t_70

 

就类似于这种情况, 业务代码块里面抛出了异常, 是直接 try-fially 处理的, 也就是 如果出现了异常会直接 抛出去 

事务处理这边检测到了 异常, 是处理事务这边的业务, 回滚相关业务操作, 然后 将异常抛出去 

然后来到了 doWithRecord[这里只是一个模拟, 类似于一些基础工具模块], 类似于有一个任务记录, 需要执行这个任务记录, 任务执行之前, 之后会做一些事情, 发生了异常会做一些事情, 将这些"模板化"起来 

可以看到的是 doWithRecord 里面是记录了任务执行失败, 以及一些异常信息, 但是 没有在日志中体现出来, 要找具体的体现的话 是需要在 record 中去寻找 

 

但是 假设是对 record 这块的情况不太了解的开发来看的话, 这块 就回很懵, 因为 他只看到了 日志里面什么异常情况都没有, 但是事务回滚了, 并且 业务代码这边是 try-finally 无法在异常处打断点 

但是 如果是对 record 这部分有一些了解的话, 那可能稍微好点, 可能知道 从 record 里面取查询, 看下 异常信息 

反正 我这次是 吃了一点亏, 伤到了 要记录一下 ... 

 

我个人认为是可以在 doWithRecord 里面添加一下日志处理的, 因为这属于一些 基础服务的代码, 业务开发这边未必会仔细的去看这块的代码, 一般应该都是 很信任这块的代码, 然后就导致了 一些情况下 思路没对的话, 可能会 绕很久 

如果是 一些确实是可以 ignore 的异常, 这种 "吞掉"[当然这里是处理了的, 只是不太明显] 的处理, 那就无所谓了 

 

 

完 

 

 

 

 

这篇关于108 老生常谈的异常被“吞掉“的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/826346

相关文章

Spring Boot统一异常拦截实践指南(最新推荐)

《SpringBoot统一异常拦截实践指南(最新推荐)》本文介绍了SpringBoot中统一异常处理的重要性及实现方案,包括使用`@ControllerAdvice`和`@ExceptionHand... 目录Spring Boot统一异常拦截实践指南一、为什么需要统一异常处理二、核心实现方案1. 基础组件

Python中异常类型ValueError使用方法与场景

《Python中异常类型ValueError使用方法与场景》:本文主要介绍Python中的ValueError异常类型,它在处理不合适的值时抛出,并提供如何有效使用ValueError的建议,文中... 目录前言什么是 ValueError?什么时候会用到 ValueError?场景 1: 转换数据类型场景

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

Python中的异步:async 和 await以及操作中的事件循环、回调和异常

《Python中的异步:async和await以及操作中的事件循环、回调和异常》在现代编程中,异步操作在处理I/O密集型任务时,可以显著提高程序的性能和响应速度,Python提供了asyn... 目录引言什么是异步操作?python 中的异步编程基础async 和 await 关键字asyncio 模块理论

详解Python中通用工具类与异常处理

《详解Python中通用工具类与异常处理》在Python开发中,编写可重用的工具类和通用的异常处理机制是提高代码质量和开发效率的关键,本文将介绍如何将特定的异常类改写为更通用的ValidationEx... 目录1. 通用异常类:ValidationException2. 通用工具类:Utils3. 示例文

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法

消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法   消除安卓SDK更新时的“https://dl-ssl.google.com refused”异常的方法 [转载]原地址:http://blog.csdn.net/x605940745/article/details/17911115 消除SDK更新时的“

JVM 常见异常及内存诊断

栈内存溢出 栈内存大小设置:-Xss size 默认除了window以外的所有操作系统默认情况大小为 1MB,window 的默认大小依赖于虚拟机内存。 栈帧过多导致栈内存溢出 下述示例代码,由于递归深度没有限制且没有设置出口,每次方法的调用都会产生一个栈帧导致了创建的栈帧过多,而导致内存溢出(StackOverflowError)。 示例代码: 运行结果: 栈帧过大导致栈内存