modo migliore per definire un'eccezione generata da un metodo in Java?

2

So come definire le eccezioni e tutto, ma non sono sicuro che il modo in cui lo sto facendo sia il più intuitivo e leggibile da un altro utente.

Ho un metodo molto semplice che ho scritto che voglio lanciare un'eccezione, perché è più semplice controllare manualmente i valori di ritorno; il metodo è privato e non è necessario definire un tipo di eccezione pubblica. Nessuna delle eccezioni Java esistenti soddisfa esattamente l'errore, quindi sto cercando di capire quale tipo di eccezione voglio lanciare qui?

Non voglio solo lanciare una RuntimeException, voglio solo catturare la mia specifica eccezione che lancio, tutte le altre eccezioni dovrebbero propagarsi. Ho pensato di definire una piccola classe interiore per la mia eccezione. Tuttavia, non ho davvero bisogno di sovrascrivere nulla nella classe RuntimeException, voglio solo catturare e stampare il suo messaggio. Quindi ora ho una riga che dice qualcosa come

private class MissingPropertyException extends RuntimeException{};

Questo non fa altro che consentirmi di individuare solo l'eccezione che sto deliberatamente gettando ignorando il resto. Questa è una buona sintassi? è strano definire una classe interiore senza implementare nulla al suo interno. C'è un modo per farlo elegantemente senza creare una classe interna vuota?

    
posta dsollen 09.03.2013 - 02:14
fonte

7 risposte

3

Presumo che ci siano situazioni in cui ragionevole genera eccezioni.

Inoltre assumerò che questo sia una situazione in cui ragionevole usi le eccezioni. (Il fatto che questo sia "interno" al tuo codice non altera questo e non puoi ragionevolmente dedurre che le eccezioni siano appropriate in base al nome dell'eccezione proposto ... @Jarrod Roberson note!)

Quindi la domanda è se sia ragionevole dichiarare una classe di eccezione private . A questo direi "Sì", partendo dal presupposto che non esiste una classe di eccezioni valida.

Gli unici corridori che vorrei fare è che se c'è qualche possibilità che l'eccezione possa "perdere", allora:

  • dovresti dichiarare un costruttore in modo che l'eccezione abbia una ragione String e
  • dovresti dichiararlo come public ... in modo che qualsiasi javadoc per l'eccezione venga visualizzato nella documentazione dell'API pubblicata.
risposta data 09.03.2013 - 05:16
fonte
3

Le eccezioni non riguardano errori che possono essere ragionevolmente controllati. Inoltre, non sono sicuro del motivo per cui definisci un tipo di eccezione privata poiché non sarai in grado di rilevare tale eccezione mentre si propaga. Non sono nemmeno sicuro del motivo per cui stai creando una classe interiore.

L'estensione di RuntimeException, Exception o Throwable non riguarda il comportamento di override. Si tratta di creare una gerarchia di eccezioni appropriata per la tua applicazione. Ad esempio, se stai guidando una macchina, un'eccezione di basso livello potrebbe essere GPSReadError che è un tipo di NavigationError, che è un tipo di AutoDriveError che è un tipo di VehicleException. Si tratta anche di identificare la fonte dell'eccezione. Ad esempio, un GPSReadError non verrebbe utilizzato quando si controlla la pressione dei pneumatici.

Le eccezioni IMHO sono un'area in cui Java può essere ripulito, con framework come le sottoclassi di lancio primaverile di RuntimeException quasi esclusivamente. In effetti, è possibile esaminare l'uso intelligente di RuntimeExceptions da parte di Spring per classificare meglio gli errori quando si utilizza JDIBC. link

    
risposta data 09.03.2013 - 03:35
fonte
0

L'autore di Rod Johnson di Progettazione e sviluppo J2EE esperti menzionato eccezioni di runtime è spesso un'alternativa migliore alle eccezioni controllate (ovviamente molte cose dipendono dalla logica aziendale e dai membri del team).

Ma piuttosto

private class MissingPropertyException extends RuntimeException{};

puoi usare / progettare qualcosa di simile a NestedRuntimeException

    
risposta data 09.03.2013 - 09:11
fonte
0

Gli altri hanno tenuto lezioni sul corretto utilizzo delle eccezioni, quindi, invece di ripeterlo, suggerirei un'alternativa sotto forma di qualcosa chiamato opzionale :

Optional<String> optionalProperty = myMethod();
if (optionalProperty.isPresent())
   // do something with it
else
   // property did not exist

Questo approccio costringe il codice chiamante a intraprendere un'azione nel caso in cui il valore di ritorno sia mancante. Questo è analogo all'utilizzo di throws MissingPropertyException che costringe anche il chiamante a gestirlo, ma penso che l'uso di Opzionale sia più esplicito.

    
risposta data 09.03.2013 - 10:20
fonte
0

Va bene creare una sottoclasse di eccezione "vuota". Basta vederlo come una classificazione.

Mi attengo comunque a YAGNI e cerco sempre il codice che potrebbe effettivamente filtrare il tipo di eccezione che crei.

    
risposta data 09.03.2013 - 13:08
fonte
0

Side stepping tutti gli argomenti "should" e "should not" (che sono rilevanti, btw) .. se alla fine si finisce con una "inner class", almeno renderla "statica":

private static class MissingPropertyException extends RuntimeException{};
    
risposta data 10.03.2013 - 02:20
fonte
0

Se capisco il tuo utilizzo, prenderei in considerazione l'utilizzo di una "IllegalStateException" per questo con un buon messaggio. È già integrato in Java.

I motivi per cui hai scelto un'eccezione non controllata non mi sono chiari, ma penso che avrebbe senso sul metodo build () di un Schema generatore se il costruttore richiede l'utilizzo di uno dei numerosi parametri possibili. Controlla il tuo ragionamento per l'utilizzo di un'eccezione non controllata contro il mio post sul blog su verificato vs eccezioni non controllate .

    
risposta data 10.03.2013 - 05:04
fonte

Leggi altre domande sui tag