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进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Java对异常的认识与异常的处理小结

《Java对异常的认识与异常的处理小结》Java程序在运行时可能出现的错误或非正常情况称为异常,下面给大家介绍Java对异常的认识与异常的处理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参... 目录一、认识异常与异常类型。二、异常的处理三、总结 一、认识异常与异常类型。(1)简单定义-什么是

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

redis在spring boot中异常退出的问题解决方案

《redis在springboot中异常退出的问题解决方案》:本文主要介绍redis在springboot中异常退出的问题解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴... 目录问题:解决 问题根源️ 解决方案1. 异步处理 + 提前ACK(关键步骤)2. 调整Redis消费者组

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

Java内存区域与内存溢出异常的详细探讨

《Java内存区域与内存溢出异常的详细探讨》:本文主要介绍Java内存区域与内存溢出异常的相关资料,分析异常原因并提供解决策略,如参数调整、代码优化等,帮助开发者排查内存问题,需要的朋友可以参考下... 目录一、引言二、Java 运行时数据区域(一)程序计数器(二)Java 虚拟机栈(三)本地方法栈(四)J

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决

python利用backoff实现异常自动重试详解

《python利用backoff实现异常自动重试详解》backoff是一个用于实现重试机制的Python库,通过指数退避或其他策略自动重试失败的操作,下面小编就来和大家详细讲讲如何利用backoff实... 目录1. backoff 库简介2. on_exception 装饰器的原理2.1 核心逻辑2.2