2 votes

Emboîtement de try/catch sans bloc catch interne

Je veux imbriquer un try catch sans avoir de catch dans le try interne.
Par exemple :

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

Est-ce possible et est-ce une bonne pratique ?

1voto

Adriaan Koster Points 6264

Vous pouvez le faire :

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

Les exceptions déclenchées par conn.execute() sont capturées par le bloc catch. Les exceptions déclenchées par new Connection() seront supprimées :

Une exception peut être levée à partir du blo try-with-resources. Dans l'exemple writeToFileZipFileContents, une exception peut être levée dans le bloc try et jusqu'à deux exceptions peuvent être levées à partir du bloc try-with-resources lorsqu'elle tente de fermer les objets ZipFile et BufferedWriter. Si une exception est levée dans le bloc try et qu'une ou plusieurs exceptions sont levées à partir de l'instruction try-with-resources alors ces exceptions lancées par l'instruction try-with-resources sont supprimées, et l'exception levée par le bloc est la celle qui est levée par la méthode writeToFileZipFileContents. Vous pouvez récupérer ces exceptions supprimées en appelant la méthode Throwable.getSuppressed à partir de l'exception lancée par le bloc try .

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

EDIT : Comme Timothy l'a souligné, Connection ne garantit pas la fermeture d'un ResultSet qu'il a créé. Nous avons donc besoin de quelque chose comme ceci :

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
}

0voto

Timothy Truckle Points 8408

Oui, mais mieux vaut

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X