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.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

Java利用@SneakyThrows注解提升异常处理效率详解

《Java利用@SneakyThrows注解提升异常处理效率详解》这篇文章将深度剖析@SneakyThrows的原理,用法,适用场景以及隐藏的陷阱,看看它如何让Java异常处理效率飙升50%,感兴趣的... 目录前言一、检查型异常的“诅咒”:为什么Java开发者讨厌它1.1 检查型异常的痛点1.2 为什么说

Java异常捕获及处理方式详解

《Java异常捕获及处理方式详解》异常处理是Java编程中非常重要的一部分,它允许我们在程序运行时捕获并处理错误或不预期的行为,而不是让程序直接崩溃,本文将介绍Java中如何捕获异常,以及常用的异常处... 目录前言什么是异常?Java异常的基本语法解释:1. 捕获异常并处理示例1:捕获并处理单个异常解释:

Python自定义异常的全面指南(入门到实践)

《Python自定义异常的全面指南(入门到实践)》想象你正在开发一个银行系统,用户转账时余额不足,如果直接抛出ValueError,调用方很难区分是金额格式错误还是余额不足,这正是Python自定义异... 目录引言:为什么需要自定义异常一、异常基础:先搞懂python的异常体系1.1 异常是什么?1.2

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束