Avendo lavorato con le eccezioni in Java e .NET E dopo aver letto un sacco di articoli su come / quando / perché catturare eccezioni, alla fine sono arrivato con i seguenti passaggi che ho attraversato nella mia testa ogni volta che vedo accadere una potenziale eccezione, o un'eccezione devo prendere (Java) ... anche se non dovesse mai accadere (sospiro ...). E sembra che funzioni, almeno per me:
- C'è qualcosa di utile che posso fare con quell'eccezione (tranne la registrazione)? Se la risposta è sì, scrivi il codice del workaround e se la soluzione alternativa può generare eccezioni, vai a 2:
- Avvolgi l'eccezione attorno a un'eccezione di runtime, lanciala, vai a 3.
- Nella classe di livello superiore in cui è stata avviata una possibile transazione di database / processo, rilevare l'eccezione, eseguire il rollback della transazione, rilanciare l'eccezione.
- Nella classe di livello superiore (che può essere quella in cui è stata avviata la transazione), registrare l'eccezione utilizzando un framework di registrazione come slf4j (abbinato a log4j per esempio) o log4net . Se possibile, invia direttamente l'e-mail all'eccezione a una lista di distribuzione composta da sviluppatori dell'applicazione.
- Se c'è una GUI, visualizza un messaggio di errore che indica nel modo più intuitivo che cosa ha causato il problema; non visualizzare l'eccezione / stacktrace, l'utente non si cura e non ha bisogno di sapere che era una NullPointerException.
Dovrei anche aggiungere il passaggio 0 , dove sto deliberatamente buttando quella che chiamo un'eccezione "business" (una nuova eccezione che creo estendendo la classe "Exception") quando un trattamento complesso non può essere eseguito a causa di errori nei dati, ma è noto che si verificano perché sono stati identificati come casi eccezionali durante l'analisi.
Ad eccezione della parte relativa al logging, sono pienamente d'accordo con i punti scritti da "mikera"; Devo solo aggiungere che l'eccezione dovrebbe essere loggata una sola volta .
Inoltre, i passaggi che ho elencato potrebbero essere diversi se quello che stai scrivendo è un API / Framework . Lì, il lancio di eccezioni ben progettate è obbligatorio per aiutare gli sviluppatori a comprendere i propri errori.
Per quanto riguarda il test delle eccezioni, usando gli oggetti mock dovresti essere in grado di testare quasi tutto, sia esso eccezionale o meno, a patto che le tue classi rispettino la pratica migliore di "una classe per fare una cosa". Personalmente, mi assicuro anche di contrassegnare i metodi più importanti, ma nascosti, come "protetti" anziché "privati" in modo da poterli testare senza troppi problemi. A parte questo, testare le eccezioni è semplice, basta provocare l'eccezione e "aspettarsi" che si verifichi un'eccezione catturandola. Se non ricevi un'eccezione, allora hai un errore di caso di test unitario.