Continuiamo a vedere insieme cosa ci ha portato di nuovo la versione 7 di Java. Nel post precedente abbiamo visto gli string switch e le risorse autoclosable, che possono rendere il codice in caso di
try-catch-finally
molto più coinciso. Oggi parliamo ancora di innovazioni che girano intorno alla gestione dell’errore.
Horcrux numero 3: rilancia la precisione!
Spesso vorremmo gestire nel catch più di una eccezione di tipo diverso, eseguire delle operazioni e rilanciarle. Vediamo un esempio di codice:
[code lang=”java”]
public static void main(String[] args) throws IOException, SQLException {
try {
caricaFileDB();
} catch (SQLException ex) {
// logga ex
throw ex;
} catch (IOException ex) {
// logga ex
throw ex;
}
}
[/code]
Stiamo gestendo ogni tipo di eccezione lanciata dal blocco try
per poi rilanciarla. Questo codice però presenta ridondanza: prima di Java 7 l’unico modo di evitarla era di gestire l’eccezione base:
[code lang=”java”]
public static void main(String[] args) throws Exception {
try {
caricaFileDB();
} catch (Exception ex) {
// gestisci ex
throw ex;
}
}
[/code]
Così però abbiamo dovuto rilanciare l’eccezione base java.lang.Exception
dal metodo chiamante, perdendo in specificità. Con Java 7 invece:
[code lang=”java”]
public static void main(String[] args) throws IOException, SQLException {
try {
caricaFileDB();
} catch (final Exception ex) {
// gestisci ex
throw ex;
}
}
[/code]
Con il final
nella clausola catch
istruiamo il compilatore a lanciare solo quelle eccezioni checked che non sono state gestisce in nessuno dei blocchi catch
precedenti.
Horcrux numero 4: prendi tutto!
In Java 6 non esiste un modo di gestire più eccezioni in un punto solo: questo produce codice boilerplate difficile da leggere e manutenere:
[code lang=”java”]
try {
faQualcosa();
} catch(Ex1 ex1) {
gestisciEccezione1();
} catch(Ex2 ex2) {
gestisciEccezione2();
} catch(Ex3 ex3) {
gestisciEccezione3();
}
[/code]
Java 7 consente invece di gestire eccezioni multiple nel blocco catch
nel modo seguente:
[code lang=”java”]
public static void main(String[] args) throws Ex1, Ex2, Ex3, Ex4 {
try {
faQualcosa();
} catch (Ex1 | Ex2 ex) {
gestisciEccezione12():
} catch (Ex3 | Ex4 ex) {
gestisciEccezione34():
}
}
[/code]
Bello, no? Un altro passo verso codice Java più corto e leggibile!
Conclusioni
Altri Horcrux sono stati recuperati, altre piccole migliorie del linguaggio che, nella loro globalità, fanno di Java 7 un linguaggio più coinciso e potente, se pur non rivoluzionario rispetto alla versione precedente. Nel prossimo post andremo alla caccia degli ultimi Horcrux e alla fine avremo ragione dell’Oscuro Signore!
Alla prossima!