【问题标题】:Discover if exception is thrown in finally part of try-finally block发现 try-finally 块的 finally 部分是否抛出异常
【发布时间】:2013-02-23 18:02:26
【问题描述】:

我有一个简单的问题,一段简单的代码,一些基本的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 被finally 块中抛出的Exception 掩盖,但如果没有Exception 我会从finally 抛出它(如果有的话) .

我知道这一切都可以用catch 来完成,但还有其他方法吗,Java 中的一些元数据或其他任何方法?此外,如果我们可以假设这将在一个Thread 中执行,那么它可能会有所帮助,所以也许有一些方法可以发现当前Thread 的异常?

【问题讨论】:

    标签: java try-finally


    【解决方案1】:

    这件事让我一直很沮丧。

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

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

    【讨论】:

    • 是的,这肯定更好。目前我没有看到任何其他合理的解决方案。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-20
        • 2014-01-08
        • 2018-02-20
        • 2010-10-03
        • 2010-10-24
        • 1970-01-01
        • 2018-06-15
        相关资源
        最近更新 更多