4

我有一个简单的问题,一个简单的代码部分,一些基本try-finally块:

try {
  // Some code which can throw an Exception
} finally {
  // Some code which also can throw an Exception
}

我的主要问题是:有什么方法可以发现是在finally块中抛出异常而不使用catch和一些局部变量在块之间传递信息?

我在少数情况下这很有用,我不想添加一些丑陋的不必要catch的块来设置一些变量throw Exception。第一个例子是,如果我在一些 Spring 或容器管理的事务方法中,并且发生了try阻塞Exception。在这种情况下,我需要创建新事务finally以使用数据库。第二个例子是我不想让我的原件ExceptionException扔进finally块掩盖,但如果没有,Exception我会把它扔掉finally(如果有的话)。

我知道这一切都可以完成,catch但是还有其他方法吗,Java 中的一些元数据或其他任何方法?如果我们可以假设这将被一次性执行,那么它可能会有所帮助Thread,所以也许有一些方法可以发现 Exception bounded to current Thread

4

3 回答 3

6

这是让我长期感到沮丧的事情。

我通常在顶部声明一个变量 exceptionThrown=true 并在返回之前将其设置为 false 。然后你可以在 finally 处理程序中测试它。我认为这比捕获和重新抛出要好,因为后一种方法会弄乱堆栈跟踪。

我很惊讶 Java 和 C# 都没有更好的方法来处理这个问题

于 2013-03-08T08:44:36.810 回答
3

如果您使用的是 Java 7,那么try-with-resource可能会为您提供帮助。

它可以处理关闭事务,因此您不需要finally块。然后您可以将异常处理代码(例如创建新事务)放在一个catch块中。最后,如果从try块中抛出异常并且在释放资源时也抛出try异常,则可以通过调用Throwable.getSuppressed关闭事务时抛出的异常来获得异常。

于 2013-03-08T08:53:34.607 回答
2

我建议尽可能使用新的自动资源管理功能:

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

Java 7 还通过“抑制异常”增强了 Throwable:

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html#suppressed-exceptions

于 2013-03-08T08:48:27.713 回答