2010-02-16 7 views
182

A volte vedodifferenza tra l'utilizzo Throwable ed eccezione in un tentativo di cattura

try { 

} catch(Throwable e) { 

} 

E a volte

try { 

} catch(Exception e) { 

} 

Qual è la differenza

+6

Duplicate: http://stackoverflow.com/questions/581878/why-catch-exceptions-in-java-when-you-can-catch-throwables –

+2

correlate: http://stackoverflow.com/questions/2129647/exception-vs-throwable-in-java http://stackoverflow.com/questions/498217/when-should-throwable-be-used-instead-of-new-exception –

risposta

158

Con la cattura Throwable include cose che sottoclasse Error. Generalmente non dovresti farlo, eccetto forse al livello più alto di "catch all" di un thread in cui vuoi registrare o altrimenti gestire assolutamente tutto ciò che può andare storto. Sarebbe più tipico in un'applicazione di tipo framework (ad esempio un server di applicazioni o un framework di test) in cui può essere in esecuzione codice sconosciuto e non dovrebbe essere influenzata da qualsiasi cosa che non funzioni correttamente con quel codice, .

+20

Probabilmente sarebbe meglio spiegare un po ' della gerarchia qui. – Xonatron

+5

Contesto per questa risposta: Throwable include sia Errore che Eccezione come sottoclassi, quindi il primo tentativo/cattura è inclusivo del secondo ma generalmente troppo ampio. – Noel

+2

Include anche sottoclassi dirette definite dall'utente di Throwable e istanze di Throwable stesso. Non c'è niente che ti impedisca di scrivere "getta nuovo Throwable();", quindi è l'unico modo per catturare davvero tutto. – Antimony

116

La prima cattura tutte le sottoclassi di Throwable (questo include Exception e Error), la seconda cattura tutte le sottoclassi di Exception.

Error è programmaticamente irrecuperabile in qualsiasi modo e di solito non deve essere catturato, tranne che per scopi di registrazione (che passa di nuovo attraverso). Exception è programmabile recuperabile. La sottoclasse RuntimeException indica un errore di programmazione e di solito non deve essere rilevata.

+17

Abbastanza sorprendentemente, 4 anni dopo questa risposta, la maggior parte degli strumenti di "analisi del codice" segnalerà comunque l'errore di lancio critico come * critico *. La registrazione è un motivo molto valido per la cattura di Throwable. Anni di server di sviluppo mi dicono che 1) La registrazione avverrà nonostante si verifichi un 'Errore' e 2) A meno che non ci sia la registrazione, potresti non ricevere mai la notifica che è successo un OOM, lasciandoti dubbi sul motivo per cui il server ha iniziato a comportarsi in modo "divertente" –

+0

'programmaticamente irrecuperabile' significa esattamente? È così grave che non possiamo praticamente chiamare QUALSIASI metodo Java dopo averlo preso più (logging, etc) senza la possibilità di ottenere un comportamento imprevedibile da JVM come risultato? –

9

Thowable rileva tutto persino ThreadDeath che viene attivato di default per interrompere un thread dal metodo ora deprecato Thread.stop(). Quindi, con la cattura di Throwable si può essere sicuri che non avrai mai lasciare il blocco try senza almeno passare attraverso la vostra blocco catch, ma si dovrebbe essere pronti a gestire anche OutOfMemoryError e InternalError o StackOverflowError.

La cattura Throwable è più utile per i loop di server esterni che delegano tutti i tipi di richieste al codice esterno ma potrebbero non essere mai terminate per mantenere attivo il servizio.

10

Throwable è super classe Exception e Error. In casi normali dovremmo sempre prendere sottoclassi di Exception, in modo che la causa principale non vada persa.

casi solo particolari in cui si vede la possibilità che qualcosa vada male, che non ha il controllo del codice Java, si dovrebbe prendere Error o Throwable.

Mi ricordo di aver catturato Throwable per segnalare che una libreria nativa non è stata caricata.

Problemi correlati