I want to nest a try catch without having a catch in the inner try.
For example:
try (Connection conn = new Connection()) {
//Fill preparedStatement etc
try (ResultSet rs = conn.execute()){
}
} catch (SQLException e) {
//Log both exceptions here
}
Is this possible and is it a good practice?
You can do this:
try (Connection conn = new Connection()) {
ResultSet rs = conn.execute()
// do stuff with rs
} catch (SQLException e) {
// handle exception
}
Exceptions thrown by conn.execute() will be caught by the catch block. Exceptions thrown by new Connection() will be suppressed:
An exception can be thrown from the block of code associated with the try-with-resources statement. In the example writeToFileZipFileContents, an exception can be thrown from the try block, and up to two exceptions can be thrown from the try-with-resources statement when it tries to close the ZipFile and BufferedWriter objects. If an exception is thrown from the try block and one or more exceptions are thrown from the try-with-resources statement, then those exceptions thrown from the try-with-resources statement are suppressed, and the exception thrown by the block is the one that is thrown by the writeToFileZipFileContents method. You can retrieve these suppressed exceptions by calling the Throwable.getSuppressed method from the exception thrown by the try block.
See: https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html
EDIT: As Timothy pointed out, Connection does not guarantee to close a ResultSet it created. So we need something like this:
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
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With