Differenza tra l'utilizzo di Throwable e l'eccezione in un tentativo di cattura


Risposte:


247

Catturandolo Throwableinclude 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.


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

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

2
Include anche sottoclassi dirette definite dall'utente di Throwable e istanze di Throwable stesso. Non c'è nulla che ti impedisca di scrivere throw new Throwable();, quindi è l'unico modo per catturare davvero tutto.
Antimonio

3
Sebbene accettato, questo non risponde alla domanda perché la maggior parte della risposta descrive una buona pratica per catturare sia l'eccezione che il gettabile, e la domanda riguardava la differenza (come in quando usare quale quando voglio anche io). "Include elementi che includono la sottoclasse Errore" è l'unica differenza specificata ed è davvero una risposta completa: che cos'è l'errore? Perché è importante che lo includa? Altre differenze o migliori pratiche?
Oded Niv,

@OdedNiv "Che cos'è l'errore? Perché è importante che lo includa?" puoi porre quelli in un'altra domanda.
Kronen,

182

Il primo cattura tutte le sottoclassi di Throwable(questo include Exceptione 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 RuntimeExceptionindica un errore di programmazione e di solito non deve essere rilevata.


37
Abbastanza sorprendentemente, 4 anni dopo questa risposta, la maggior parte degli strumenti di "analisi del codice" segnalerà ancora che il lancio è un errore critico . La registrazione è un motivo molto valido per la cattura di Lanciabile. Anni di sviluppo di server mi dicono che 1) La registrazione accadrà nonostante ottenga un Errore 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"
Bruno Grieder

4
Cosa programmatically unrecoverablesignifica 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?
Alexander Abakumov,

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.
Nom1fan,

22

Thowablecattura davvero tutto, anche ThreadDeath che viene lanciato di default per fermare un thread dal Thread.stop()metodo ormai deprecato . Quindi catturando Throwablepuoi essere sicuro che non lascerai mai il blocco try senza almeno passare attraverso il blocco catch, ma dovresti essere pronto a gestire anche OutOfMemoryErrore InternalErroro 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.


21

Throwableè super classe di Exceptioncosì 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 Erroro Throwable.

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


0

Ho visto persone usare Throwable per rilevare alcuni errori che potrebbero accadere a causa di infra fallimento / non disponibilità.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.