调试如何在Java中记录由finally block的异常掩盖的异常?
只需一个音符:
我知道在Java中finally
块永远不应该抛出异常,否则这是[非常、非常、非常]糟糕的做法
我知道我应该使用try-catch
内部finally
来处理(例如记录或忽略)所有异常,并防止它们传播
我知道Java7的Throwable有getSuppressed
方法,但我的目标是Java5&;六,
问题:在Java中,在try-finally
中,如果try
块引发异常(将其命名为A),控件将到达finally
块(在没有异常的情况下,它也会到达,但在这个问题中它并不有趣)。然后,如果finally
块抛出一个异常(将其命名为B),异常A被抑制,或者被屏蔽/吞没,异常B被传播到调用方
问题:当一个异常被另一个异常抑制并记录第一个异常时,我能否以某种方式检测到这种情况
... 我花了太多时间去推理为什么会抛出特定的异常,却不知道到底发生了什么
理由:通常有问题的try-finally
块是在库中编码的(今天是Hibernate),所以我无法修改它们
解决方案约束:正如我在一开始所指出的,可能的解决方案不应该依赖于Java 7,但另一方面,不需要是生产级的(这样做会有好处)。AOP是这里的一个选项
(请不要发布像“使用Java 7进行开发”这样的琐碎回答:
# 1 楼答案
有一个名为“ExceptionCheck()”的JNI方法,毫不奇怪,它会检查挂起的异常。您可以在本机方法的中间调用它,以查看某个先前调用是否抛出了一个异常,该异常等待JNI方法在实际抛出之前返回。我想知道您是否可以从finally调用本机方法,然后尝试使用ExceptionCheck查看是否存在挂起的异常,这是否可行。我不知道是否会,但我认为值得一试