我想在内部尝试中没有捕获的情况下嵌套尝试捕获
例如:
try (Connection conn = new Connection()) {
//Fill preparedStatement etc
try (ResultSet rs = conn.execute()){
}
} catch (SQLException e) {
//Log both exceptions here
}
这可能吗,这是一个好习惯吗?
答案 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
}