A volte, vedo
try {
} catch(Throwable e) {
}
E qualche volta
try {
} catch(Exception e) {
}
Qual è la differenza?
A volte, vedo
try {
} catch(Throwable e) {
}
E qualche volta
try {
} catch(Exception e) {
}
Qual è la differenza?
Risposte:
Catturandolo Throwable
include cose che vanno in sottoclasse Error
. Generalmente non dovresti farlo, tranne forse al livello più alto di "cattura tutto" di un thread in cui vuoi loggarti o altrimenti gestire assolutamente tutto ciò che può andare storto. Sarebbe più tipico in un'applicazione di tipo framework (ad esempio un application server o un framework di test) in cui può essere in esecuzione codice sconosciuto e non dovrebbe essere influenzato da qualsiasi cosa vada storto con quel codice, per quanto possibile.
throw new Throwable();
, quindi è l'unico modo per catturare davvero tutto.
Il primo cattura tutte le sottoclassi di Throwable
(questo include Exception
e Error
), il secondo cattura tutte le sottoclassi di Exception
.
Error
è programmaticamente irrecuperabile in qualsiasi modo e di solito non deve essere catturato, tranne per scopi di registrazione (che lo attraversa di nuovo). Exception
è programmabilmente recuperabile. La sua sottoclasse RuntimeException
indica un errore di programmazione e di solito non deve essere rilevata.
Error
e 2) A meno che non ci sia registrazione, potresti non essere mai avvisato che è avvenuta una OOM, lasciandoti chiedendoti perché il server ha iniziato a comportarsi "divertente"
programmatically unrecoverable
significa esattamente? È così grave che non possiamo praticamente chiamare QUALSIASI metodo Java dopo averlo catturato più (registrazione, ecc.) Senza la possibilità di ottenere un comportamento imprevedibile da JVM di conseguenza?
Its subclass RuntimeException indicates a programming error
: Non sono sicuro di essere d'accordo con questa affermazione. Se ciò è vero, significa che tutte le eccezioni previste dovrebbero essere verificate eccezioni. Cosa succede se mi aspetto che qualcosa non funzioni ed è irrecuperabile dalla mia applicazione, ma vorrei almeno lanciare un'eccezione significativa? L'uso di un'eccezione controllata in quel caso sembra inutile e crea il codice boilerplate.
Thowable
cattura davvero tutto, anche ThreadDeath che viene lanciato di default per fermare un thread dal Thread.stop()
metodo ormai deprecato . Quindi catturando Throwable
puoi essere sicuro che non lascerai mai il blocco try senza almeno passare attraverso il blocco catch, ma dovresti essere pronto a gestire anche OutOfMemoryError
e InternalError
o StackOverflowError
.
La cattura Throwable
è molto utile per i loop di server esterni che delegano ogni tipo di richiesta a codice esterno ma che non possono mai terminare per mantenere attivo il servizio.
Throwable
è super classe di Exception
così come Error
. In casi normali dovremmo sempre prendere delle sottoclassi di Exception
, in modo che la causa principale non si perda.
Solo i casi speciali in cui vedi la possibilità che qualcosa vada storto e che non abbia il controllo del tuo codice Java, dovresti prendere Error
o Throwable
.
Ricordo di aver catturato Throwable per segnalare che non è stata caricata una libreria nativa.