我有一个简单的问题,一个简单的代码部分,一些基本的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
中创建新的事务来处理数据库。第二个例子是我不希望原始Exception
被Exception
finally
块中的Exception
屏蔽,但如果没有finally
,我会将其从catch
中删除{1}}(如果有的话)。
我知道这一切都可以用Thread
来完成,但有没有其他方式,Java中的一些元数据或其他什么?如果我们可以假设这将在一个Thread
中执行,那么也许会有所帮助,所以也许有一些方法可以发现与当前{{1}}绑定的异常?
答案 0 :(得分:6)
这让我长期受挫。
我通常在顶部声明变量exceptionThrown = true,并在返回之前将其设置为false。然后你可以在finally处理程序中测试它。我认为这比捕捉和重新投掷更好,因为后一种方法会破坏堆栈跟踪。
我很惊讶Java和C#都没有更好的方法来处理这个
答案 1 :(得分:3)
如果您使用的是Java 7,那么try-with-resource可以帮助您。
它可以处理关闭事务,因此您不需要finally
块。然后,您可以在catch
块中放置异常处理代码(例如创建新事务)。最后,如果从try
块抛出异常并且在释放资源时也抛出异常,则在关闭时抛出的异常上调用try
可以获得Throwable.getSuppressed
异常交易。
答案 2 :(得分:2)
我建议尽可能使用新的自动资源管理功能:
http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
Java 7还通过“抑制异常”增强了Throwable: