Hai ragione quando dici che catturare Throwable
non è una buona idea. Tuttavia, il codice che presenti nella tua domanda non cattura lo Throwable
in modo malvagio, ma ne parliamo più avanti. Per ora, il codice che si presenti nella sua domanda ha diversi vantaggi:
1. leggibilità
Se si guarda il codice con attenzione, si noterà che anche se il blocco catch sta recuperando un Throwable
, il metodo handleException
sta verificando il tipo di eccezione generata ed eventualmente prendendo diverse azioni in base al tipo di eccezione.
Il codice di cui la tua domanda è sinonimo a dire:
try {
doSomething();
} catch (SQLEXception ex){
response = handleException(resource);
} catch(IllegalArgumentException ex) {
response = handleException(resource);
} catch(Throwable ex) {
response = handleException(resource);
}
Anche se si deve prendere 10 + eccezioni solo, questo codice può facilmente prendere un sacco di righe di codice e il multi-cattura la costruzione non renderà il codice più pulito. Il codice che presenti nella tua domanda è semplicemente delegare lo catch
a un altro metodo per rendere più leggibile il metodo effettivo che fa il lavoro.
2. Riusabilità
Il codice per il metodo handleRequest potrebbe essere facilmente modificato e inserito in una classe di utilità e accessibile in tutta l'applicazione per gestire sia Exception
s e Error
s. È anche possibile estrarre il metodo in due metodi private
; Uno che gestisce Exception
e uno che gestisce Error
e ha il metodo handleException
che accetta un Throwable
delegare ulteriormente le chiamate a questi metodi.
3.Maintainibility
Se si decide che si desidera cambiare il modo di registrare un SQLException
s nella vostra applicazione, si deve fare questo cambiamento in un unico luogo, piuttosto che visitare ogni metodo in ogni classe che lancia un SQLException
.
Quindi la cattura di Throwable
è una cattiva idea?
Il codice che presenti nella tua domanda non è proprio lo stesso di quello che intercorre da solo Throwable
. Il seguente pezzo di codice è un grande no-no:
try {
doSomething();
} catch(Throwable e) {
//log, rethrow or take some action
}
Si dovrebbe prendere Throwable
o Exception
più lontano nella catena catch
possibile.
Ultimo ma non meno importante, ricorda che il codice che presenti nella tua domanda è il codice del framework e ci sono alcuni errori che il framework può ancora recuperare da. Vedere When to catch java.lang.Error per una spiegazione migliore.
A volte, in particolare nei quadri, non avete altra scelta che prendere 'Throwable'. Non è ancora una buona idea nel codice a livello di applicazione, a meno che non si desideri avere una sorta di "gestore di ultima istanza". – biziclop
Hai un link al codice open source in questione (come il file sorgente su GitHub)? Posso pensare a un paio di casi d'uso in cui, a seconda del contesto, questa potrebbe effettivamente essere una buona strategia. –
@James_pic ci vai https://github.com/Eldelshell/jongo/blob/master/jongo-core/src/main/java/jongo/RestController.java –