Questo è molto strano per me. RuntimeException
eredita da Exception
, che eredita da Throwable
.Perché non rileva Exception catch RuntimeException?
catch(Exception exc) { /* won't catch RuntimeException */
ma
catch(Throwable exc) { /* will catch RuntimeException */
so RuntimeException
è speciale in quanto è incontrollato. Ma per quanto ne so, si applica solo per stabilire se devono essere dichiarate le eccezioni, e non se vengono catturate. E anche allora, non so perché questa logica si rompa con la cattura di Throwable.
Questo è abbastanza importante per me poiché ho una situazione in cui RuntimeExceptions può essere generata in un'operazione terminale. Non sono sicuro del nome di questo modello, ma qualcosa del genere, la mia classe EmailRoller
accetta un array di Callbacks
. Il codice è simile al seguente:
for(Callback cb : callbacks) {
try {
cb.call(item);
}
catch(Exception exc) {
logger.error("Error in callback: ", exc);
}
}
Quindi questo è un caso in cui qualcosa come un OOME ha bisogno di volare attraverso, perché se uno di questi callback consuma tutta la memoria della macchina, che sicuramente come diamine sta andando ad incidere l'esecuzione di gli altri. Ma uno NullPointerException
? O un IndexOutOfBoundsException
? Quelli influenzeranno la richiamata ma non impediranno l'esecuzione degli altri.
Inoltre, questo è un po 'un design aziendale. Diversi programmatori o team possono aggiungere callback per elaborare l'articolo, ma dovrebbero essere isolati l'uno dall'altro. Ciò significa che, poiché il programmatore è responsabile dell'isolamento reciproco di questi callback, non dovrei fare affidamento su di essi per evitare errori. La cattura Exception
dovrebbe essere sulla linea giusta, ma non è perché RuntimeException
scivola attraverso. Quindi la mia domanda più generale è: qual è un buon modello qui? Solo catch(Exception | RuntimeException exc)
, che credo sia un errore di sintassi a causa dell'ereditarietà?
Rileggere il mio codice. È corretto. Il mio livello di isolamento era buggato, poiché l'eccezione di runtime proveniva da un 'if (results.foo.bar()) {/ * applica callback * /}', che era un NPE. – djechlin
@djechlin: Il tuo post non mostra * 'if (results.foo.bar())' - non è molto chiaro cosa stai chiedendo a questo punto ... –