加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

如何记录在Java中被finally块的异常掩盖的异常?

发布时间:2020-12-15 02:24:44 所属栏目:Java 来源:网络整理
导读:请注意: 我知道在 Java中,finally块永远不应该抛出异常,否则它是非常非常非常糟糕的做法. 我知道我最终应该使用try-catch来处理(例如记录或忽略)所有异常并阻止它们传播. 我知道Java 7的Throwable有getSuppressed方法,但我的目标是Java 5 6. 问题:在Java中
请注意:
我知道在 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块遮蔽.

这是不完美的,而且我肯定不会在制作中使用它(我只需要在录制内容等所有竞争条件上投入大量工作.比我想做的更多工作调试,坦率地说).但它可能会为您提供您正在寻找的信息,特别是在小范围的课程中谨慎使用时.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读