如何记录在Java中被finally块的异常掩盖的异常?
请注意:
我知道在 Java中,finally块永远不应该抛出异常,否则它是非常非常非常糟糕的做法. 我知道我最终应该使用try-catch来处理(例如记录或忽略)所有异常并阻止它们传播. 我知道Java 7的Throwable有getSuppressed方法,但我的目标是Java 5& 6. 问题:在Java中,在try-finally中,如果try块抛出异常(名称为A),则控制到达finally块(如果没有异常,它也会到达它,但在这个问题中它没有意义).然后,如果finally块抛出异常(将其命名为B),则异常A被抑制或被屏蔽/吞噬,异常B被传播给调用者. 问题:当一个异常被另一个异常压缩并记录/记录第一个异常时,我可以以某种方式检测到这种情况吗? 理由:通常有问题的try-finally块在库中编码(今天它是Hibernate),所以我无法修改它们. 解决方案限制:正如我在开始时所指出的那样,可能的解决方案不应该在Java 7上进行转发,但另一方面,不需要是生产等级(这样会是一种奖励). AOP是这里的选择. (请不要发布像“使用Java 7进行开发”这样的琐碎答案:) 解决方法
我认为的问题是,即使使用AOP,您也无法拦截异常消费过程.使用AOP,您可以捕获所有创建的异常,但是您无法知道它们何时被消耗.
例如: try { ... } catch (Exception e) { log.boom("Ouchies happened here",e); } 并非每次例外都被重新抛出. 但是,在某个级别上,最终抛出MOST异常,以便调用者可以处理它们. 所以,鉴于你可能会“泄漏”异常,游戏就是试图找到“泄漏”例外. 使用AOP,您可以在创建时消除每个异常(无论您是在异常级别执行此操作,还是必须在单个级别执行此操作,我不能说 – 在实践中不熟悉AOP)案件). 一旦您在创建异常时捕获异常,就会开始通过AOP包装方法调用.执行此操作时,您可以捕获方法抛出的异常. 因此,通过一些工作,您知道从方法返回时a)创建了哪些异常并且b)抛出了哪些异常.如果从方法中遍历返回异常的“由…引起”的异常,则可以将这些异常从“此方法创建的异常”列表中删除.其余的是漏洞. 理想情况下,经过一些分析后,您将能够识别哪些不被抛出(但以其他方式处理),以及哪些实际上被您的finally块遮蔽. 这是不完美的,而且我肯定不会在制作中使用它(我只需要在录制内容等所有竞争条件上投入大量工作.比我想做的更多工作调试,坦率地说).但它可能会为您提供您正在寻找的信息,特别是在小范围的课程中谨慎使用时. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 多线程 – Julia v0.5中不同形式并行的开销是多少?
- java – 集合vs列表vs数组作为EJB方法的返回类型
- java.lang.NoClassDefFoundError:org / springframework /
- java – 为什么InterruptedException是一个经过检查的异常?
- java – 如何在Spring上运行EnableScheduling注释来重新启动
- java – 当我通过jdbctemplate在表中插入一个记录时,如何获
- Java集合框架之Collection接口详解
- java – 在Jenkins中运行已编译的Jar文件
- 在Java中查找负数的最大乘积
- java – BigDecimal数字的格式