嵌套尝试/捕获内部捕获块

时间:2017-05-02 13:27:51

标签: java exception try-catch

我想在内部尝试中没有捕获的情况下嵌套尝试捕获 例如:

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

这可能吗,这是一个好习惯吗?

2 个答案:

答案 0 :(得分:1)

你可以这样做:

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

conn.execute()抛出的异常将被catch块捕获。新Connection()抛出的异常将被禁止:

  

可以从与之关联的代码块中抛出异常   尝试使用资源声明。在示例中   writeToFileZipFileContents,可以从try抛出异常   阻止,最多可以抛出两个异常   尝试关闭ZipFile时尝试使用资源语句   BufferedWriter对象。如果从try块抛出异常   并且从try-with-resources中抛出一个或多个异常   声明,然后从try-with-resources抛出的那些异常   语句被抑制,并且块抛出的异常是   writeToFileZipFileContents方法抛出的一个。您可以   通过调用来检索这些被抑制的异常   从try抛出的异常中的Throwable.getSuppressed方法   块。

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

编辑:正如Timothy指出的那样,Connection不保证关闭它创建的ResultSet。所以我们需要这样的东西:

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
}

答案 1 :(得分:0)

是的,但更好的是

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