嵌套的try块 - 这有用吗?

时间:2015-10-08 07:53:51

标签: java try-catch

我遇到了一段看起来像这样的代码

try
{
    try (SomeResource res = new SomeResource())
    {
        // "\(o.o)/" *BOO*
    }
}
catch (SomeException e)
{
    e.letsNotIgnoreTheException();
}

我想不出使用两个try-blocks的原因。我问的其他任何人都不会想到一个。

我不禁要问,这是否简单 一个需要进行重构的方法,或者如果实际上有一些用于外部尝试(特别是因为我发现了几次,但是又一次, 有人可能只是误解了资源的尝试。

5 个答案:

答案 0 :(得分:3)

鉴于实际代码中没有额外的控制流或尝试构造,您的代码等同于:

res.close()

请注意:

  • try-with-resources在异常处理之前执行e.letsNotIgnoreThisException()
  • 因此res.close()*BOO*
  • 之后被称为
  • {{1}}行抛出的任何其他异常必须妥善处理(即捕获或声明)

这里描述了解释资源关闭和异常处理在try-with-resources中的执行顺序的关键线:

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

报价:

注意: try-with-resources语句可以像普通的try语句一样拥有catch和finally块。在try-with-resources语句中,在声明的资源关闭后运行任何catch或finally块。

答案 1 :(得分:1)

答案 2 :(得分:0)

如果外部的try-catch除了内部尝试之外什么都没有,那么它是不必要的,因为你可以将它们组合成一个。但是,如果外部try-catch中还有其他内容,则语义可能会有所不同。

答案 3 :(得分:0)

<强>反驳:

这与单个try块的执行方式不同 - try-with-resources转换为关闭finally块中的资源,在 catch块之后执行,而try-with-resources在嵌套的try块在外部catch块之前执行

如果要在执行catch块之前关闭SomeResource资源,这可能很有用。

例如,如果您正在将某些内容写入文件并且出错时想删除该文件内容并将错误消息写入同一文件(我知道这是虚拟示例),您可以先关闭资源来执行此操作,然后删除文件并在新的流/资源中写入错误。

答案 4 :(得分:0)

访问数据库时,这种模式经常发生 - 主要是为了确保资源正确关闭,同时在处理每条记录时处理错误而不停止查询。

    try {
        ResultSet rs = query.executeQuery();
        try {
            // Each row.
            while (rs.next()) {
                // Handle each record.
                try {
                    // One row.
                } catch (SomeException se) {
                    // Deal with exception when processing the row so we do not abort the whole query.
                }
            }
        } catch (SQLException se) {
            // Perhaps database connection went down during the iteration.
        } finally {
            // Remember to close - whatever happens.
            rs.close();
        }
    } catch (Exception ex) {
        // Probably the query is malformed or something.
        log.error("failed", ex);
    }