当前位置: 首页 > 知识库问答 >
问题:

无内挡块的嵌套尝试/捕捉

罗安和
2023-03-14

我想嵌套一个try catch,但内部try中没有捕获。
例如:

try (Connection conn = new Connection()) {
    //Fill preparedStatement etc
    try (ResultSet rs = conn.execute()){
    }
} catch (SQLException e) {
    //Log both exceptions here
}

这可能吗?这是一种良好的做法吗?

共有2个答案

蒋高超
2023-03-14

是的,但更好的是

try (Connection conn = new Connection(); ResultSet rs = conn.execute();){
    } catch (SQLException e) {
    //Log both exceptions here
}
左仰岳
2023-03-14

你可以这样做:

try (Connection conn = new Connection()) {
    ResultSet rs = conn.execute()
    // do stuff with rs
} catch (SQLException e) {
    // handle exception
}

conn.execute()抛出的异常将被catch块捕获。new Connection()抛出的异常将被抑制:

可以从与try with resources语句关联的代码块中引发异常。在示例writeToFileZipFileContents中,可以从try块引发异常,当try with resources语句尝试关闭ZipFile和BufferedWriter对象时,最多可以从try with resources语句引发两个异常。如果从try块引发异常,并且从try with resources语句引发一个或多个异常,则从try with resources语句引发的异常将被抑制,并且该块引发的异常是由writeToFileZipFileContents方法引发的异常。您可以通过调用Throwable来检索这些被抑制的异常。从try块引发的异常中获取抑制的方法。

请参阅:https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

编辑:正如Timothy所指出的,连接并不能保证关闭它创建的结果集。所以我们需要这样的东西:

try (Connection conn = new Connection(); 
     Statement statement = connection.createStatement()) {

    // statement.set(....)

    try (ResultSet rs = conn.execute()) {
        // do stuff with rs
    }

} catch (SQLException e) {
    // handle exceptions
}
 类似资料:
  • 我试图重构这段代码,导致PMD抛出失败:PreserveStackTrace:3,主要问题是如何将异常e1折叠为e2,现在是反模式吗?我正在考虑第二次尝试或最终投入,但这可能会导致业务逻辑出现问题。 代码:

  • 本文向大家介绍C#嵌套异常并尝试catch块。,包括了C#嵌套异常并尝试catch块。的使用技巧和注意事项,需要的朋友参考一下 示例 一个能够在另一个try catch内部嵌套一个异常/块。 这样一来,您可以管理小的代码块,这些代码块可以在不破坏整个机制的情况下正常工作。 注意:抛出父catch块时,避免吞咽异常

  • 我是新来的。我试图用它来建立自己的网站。我想做的是在父组件中嵌套一个子组件;父组件应该在主页中呈现,子组件嵌套在主页中。下面我举了一个我尝试的例子。 到目前为止,我的方法是 在“childComponent”中创建子组件。js' 这里的问题是“childComponent”在我的React应用程序中永远不可见。我是不是走错了路?有没有我不懂的基本机械原理? 提前感谢!! -- 子组件(childC

  • 问题内容: 我只是在学习Java异常处理和Java。我制作了一个Swing GUI,用户将在两个字段中输入整数,然后单击带有算术函数的单选按钮,答案将出现在第三个文本字段中。我想包含一个try / catch块,以在用户将前两个字段之一留为空白或输入除整数以外的内容时捕获异常,以及如果用户尝试将其除以零则输入第二个catch。该窗体可以正常工作,但是不会捕获错误,只能返回堆栈跟踪并使程序崩溃。我感

  • 我想运行几行代码,但我不确定是否有任何行会抛出错误。但是如果发生错误,我希望脚本忽略该行并继续。 一种选择是使用<code>try-catch-end TL;TR:除了为下面示例代码中的每一行编写<code>try-catch-end 示例代码: 输出: 首选输出: 相关:为什么我不应该在“try”-“catch”中包装每个块?

  • 问题内容: 下面的代码询问用户他/她想要多少个赛车手。 如果在代码中输入数字,则代码会跳出循环,并且程序的其余部分可以正常运行;但是,当我输入诸如“ awredsf”之类的内容时,它应该捕获该异常,并且确实如此。它没有连续提示用户,而是连续循环,这对我来说没有意义。 连续循环时,程序打印如下: 多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车手应该参加比赛?多少赛车