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

相关文章

Java Optional避免空指针异常的实现

《JavaOptional避免空指针异常的实现》空指针异常一直是困扰开发者的常见问题之一,本文主要介绍了JavaOptional避免空指针异常的实现,帮助开发者编写更健壮、可读性更高的代码,减少因... 目录一、Optional 概述二、Optional 的创建三、Optional 的常用方法四、Optio

Java异常架构Exception(异常)详解

《Java异常架构Exception(异常)详解》:本文主要介绍Java异常架构Exception(异常),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. Exception 类的概述Exception的分类2. 受检异常(Checked Exception)

Java报NoClassDefFoundError异常的原因及解决

《Java报NoClassDefFoundError异常的原因及解决》在Java开发过程中,java.lang.NoClassDefFoundError是一个令人头疼的运行时错误,本文将深入探讨这一问... 目录一、问题分析二、报错原因三、解决思路四、常见场景及原因五、深入解决思路六、预http://www

一文带你深入了解Python中的GeneratorExit异常处理

《一文带你深入了解Python中的GeneratorExit异常处理》GeneratorExit是Python内置的异常,当生成器或协程被强制关闭时,Python解释器会向其发送这个异常,下面我们来看... 目录GeneratorExit:协程世界的死亡通知书什么是GeneratorExit实际中的问题案例

Java捕获ThreadPoolExecutor内部线程异常的四种方法

《Java捕获ThreadPoolExecutor内部线程异常的四种方法》这篇文章主要为大家详细介绍了Java捕获ThreadPoolExecutor内部线程异常的四种方法,文中的示例代码讲解详细,感... 目录方案 1方案 2方案 3方案 4结论方案 1使用 execute + try-catch 记录

解决java.lang.NullPointerException问题(空指针异常)

《解决java.lang.NullPointerException问题(空指针异常)》本文详细介绍了Java中的NullPointerException异常及其常见原因,包括对象引用为null、数组元... 目录Java.lang.NullPointerException(空指针异常)NullPointer

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 模块理论