刚一说明: 我知道在Java中finally
块不应该抛出异常,否则就[非常,非常,非常]糟糕的做法。
我知道,我应该在finally
内使用try-catch
来处理(例如记录或忽略)所有异常并防止它们传播。
我知道该爪哇7的Throwable的具有getSuppressed
的方法,但我定位的Java 5 & 6.如何记录Java中finally块的异常所掩盖的异常?
问题:在Java中,在try-finally
如果有异常(命名为甲)由try
块,控制抛出达到finally
区块(在没有例外的情况下它也达到了它,但在这个问题中它不是很有趣)。然后,如果finally
块引发异常(将其命名为B),则将例外A抑制或屏蔽/吞下,并且将异常B传播给调用者。
问:我可以以某种方式检测时,唯一的例外是另一个抑制情况和日志/记录的第一个?
......我花了太多时间推理为什么特定的异常已经抛出,不知道什么真的发生了。
理由:经常有问题try-finally
块被编码在一个库中(今天是Hibernate),所以我无法修改它们。
解决方案的限制:正如我在开始时指出,可能的解决方案不应该转发关于Java 7,但是,在另一方面,也不需要是生产高档(是这样的,将是一个奖金)。 AOP是这里的一个选项。
(请不要张贴琐碎的答案,如“使用Java 7的开发” :)
如果我拦截每个方法,这会使JVM运行缓慢吗?我注意到,有时候Eclipse的断点将JVM放慢了50倍(JVM 1.6,体面的Eclipse版本)...... – 2011-03-31 07:39:57
很显然,拦截将会产生一些成本,但它不应该削弱系统。但另一个原因是要谨慎使用它,只能用于调试。您不必在每种方法上都有它,只需要每个您想要追踪异常的入口点。 – 2011-03-31 15:53:20