发现是否在try-finally块的最后部分抛出异常

时间:2013-03-08 08:40:15

标签: java try-finally

我有一个简单的问题,一个简单的代码部分,一些基本的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或容器管理的事务方法中,并且在tryException中发生了。在这种情况下,我需要在finally中创建新的事务来处理数据库。第二个例子是我不希望原始ExceptionException finally块中的Exception屏蔽,但如果没有finally,我会将其从catch中删除{1}}(如果有的话)。

我知道这一切都可以用Thread来完成,但有没有其他方式,Java中的一些元数据或其他什么?如果我们可以假设这将在一个Thread中执行,那么也许会有所帮助,所以也许有一些方法可以发现与当前{{1}}绑定的异常?

3 个答案:

答案 0 :(得分:6)

这让我长期受挫。

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

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

答案 1 :(得分:3)

如果您使用的是Java 7,那么try-with-resource可以帮助您。

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

答案 2 :(得分:2)