2009-05-05 12 views
6

C'è qualche punto nell'avere un com.myco.myproj.MyProjRuntimeException, che completley estende RuntimeException?Perché un RuntimeException specifico del progetto?

+0

Ciò ha provocato un'interessante serie di risposte, ma senza alcun chiaro consenso. Ciò suggerisce che la domanda è altamente soggettiva e non può essere risolta in modo definitivo. – erickson

+0

Sì, dovresti. Ho raccolto alcuni punti su di esso http://jyops.blogspot.in/2012/03/why-should-you-use-unchecked-exceptions.html. – ManuPK

risposta

7

Sì. Do throw deselezionate eccezioni e sottoclasse.

Si parla molto di se le eccezioni controllate sono davvero buone. In poche parole, se lancio un'eccezione verificata, il mio cliente ha davvero qualcosa a che fare con questo?

Le eccezioni non selezionate sono un buon modo per notificare ai clienti situazioni eccezionali (incluse condizioni preliminari illegali), e tuttavia non gravarle con la necessità di avvolgere chiamate alla propria API con blocchi try-catch, che la maggior parte delle volte fondamentalmente non servono a nulla, tranne il debugging, il tracciamento, ecc.

Allora perché non lanciare un RuntimeException? Non è elegante, ed è meno leggibile. Rendilo la tua eccezione che ne deriva, anche se per nessun motivo è diverso dall'essere più specifico quando lancia l'eccezione.

+0

Quando le eccezioni (controllate o meno) non sono tradotte in un tipo appropriato per ogni livello di astrazione, l'astrazione perde. Se non stai veramente recuperando dalle eccezioni, ma semplicemente prendendo Throwable e segnalandolo, questo non è un problema. Ma se si desidera ripristinare da alcune eccezioni, è necessario tradurle su un livello intermedio o terminare con una dipendenza dall'eccezione specifica dell'implementazione. – erickson

+0

Ci scusiamo per il ritardo nell'accettazione, novellino. Ho lanciato RuntimeExceptions non elaborato per un po 'di tempo, in precedenza avevo creato il mio. Quando li incontro ora, rivisitando il codice, sembrano brutti. Ora preferirei tornare al mio stile originale: creare sottoclassi significative di RuntimeException. – TimP

+1

ritardo di 2,5 anni;) –

1

Non proprio. Le informazioni extra ottenute dall'avere visualizzato il nome dell'eccezione in una traccia di stack potrebbero essere fornite semplicemente impostando la stringa di messaggio di uno standard RuntimeException. Tuttavia (a pensarci bene), potrebbe essere utile creare sottoclasse RuntimeException semplicemente per anteporre una stringa personalizzata a qualsiasi messaggio.

Tendo a fare solo eccezioni controllate personalizzate; in generale, le eccezioni standard non controllate coprono già un numero sufficiente di casi potenziali.

1

È uno stile valido per mantenere la propria gerarchia delle eccezioni.

Ma ho visto solo poche persone che possono utilizzare questa tecnica con profitto reale.

1

in Effective Java, Joshua Bloch scrive: eccezioni

Usa di runtime per indicare errori di programmazione. La grande maggioranza delle eccezioni di run-time indica violazioni precondizioni.

Detto questo, è possibile utilizzare tale eccezione di runtime come classe base per una gerarchia di eccezioni di run-time, utilizzata nel progetto. In questo modo, gli errori diventano più leggibili e tracciabili.

2

Dipende se si desidera gestire la condizione eccezionale in modo diverso rispetto ad altre eccezioni più in alto dello stack di chiamate. Se intendi catturare e gestire l'eccezione, ti consigliamo di creare il tipo personalizzato. Rende il codice più leggibile e clausole di cattura più pulite. Se non hai intenzione di cogliere l'eccezione, probabilmente ci sono pochi motivi per creare un nuovo tipo.

1

Molte persone (me e i progettisti di C# incluso) believe che controlla le eccezioni sono un esperimento linguistico fallito ed evitali. Quindi, creare la propria gerarchia di eccezioni in RuntimeException è un passaggio ovvio.

0

Rod Jonhson ha scritto su questo nella progettazione e sviluppo one-to-one J2EE di Expert e come nella risposta di Tom RuntimeException deve essere utilizzato per errori di programmazione. Un buon esempio è SQLException, l'API di accesso ai dati di livello inferiore dovrebbe catturarli e lanciare la propria "SQLRuntimeException" nella maggior parte dei casi in cui il codice chiamante non può fare nulla con l'eccezione. In questo modo, i tuoi apis di livello superiore non sono obbligati a rilevare o portare eccezioni di livello inferiore nella loro firma, il che rende il codice più semplice e più focalizzato sul dominio aziendale.

0

eccezioni sottoclasse basata sulla come vengono gestite piuttosto che chi li ha scritti ...

eccezione di runtime In genere non può essere gestita in un altro modo di registrazione di errore e, eventualmente, visualizzare un messaggio di errore.

Eccezioni controllate potrebbero eventualmente avere un ripiego specifica, e in tal caso essi devono probly non sottoclasse un "MyFrameWorkException" - come in questo caso, la cattura di un MyFrameWorkException non sarebbe fare di più che il fermo generico (logging, ecc)

È una pratica piuttosto brutta inventare un'intera hiearachy delle eccezioni che ha poco in comune tranne il fatto che esse appartengono a un particolare quadro. (i pacchetti sono presumibilmente utilizzati solo per questo.)

E 'perfettamente ok per sottoclasse RuntimeException (se le sottoclassi esistenti non sono un dio in forma)

documento eccezioni unchecked. Sii prudente con le eccezioni controllate e non costruire gerarchie.

1

A mio parere, è necessario creare nuove eccezioni solo se si dispone di proprio, ovvero si desidera prenderle e fare un trattamento specifico su di esse. In tutti gli altri casi, non vedo davvero l'utilità.

Problemi correlati