-
Utilizza le eccezioni per cose eccezionali, le cose che non puoi ragionevolmente aspettarti di incontrare troppo spesso, cose che indicano che qualcosa va storto. Ad esempio, se la rete non funziona, è una cosa eccezionale per un server web. Se il database non è disponibile, significa che qualcosa non va. Se il file di configurazione è mancante, probabilmente significa che l'utente lo ha incasinato.
-
Non utilizzare eccezioni per gestire codice errato. Per verificare la correttezza del codice, è necessario utilizzare le asserzioni o, in .NET Framework 4 e versioni successive, i contratti di codice (che sostituiscono le asserzioni e hanno caratteristiche aggiuntive particolarmente preziose).
-
Non utilizzare le eccezioni in casi non eccezionali. Il fatto che l'utente, quando è stato chiesto di inserire un numero, abbia inserito "cane" non è così eccezionale da meritare un'eccezione.
-
Fai attenzione quando scegli i tipi di eccezioni. Crea i tuoi tipi quando necessario. Scegli con cura l'eredità, tenendo presente che i genitori che catturano cattureranno anche i bambini. Mai throw Exception
.
-
Non utilizzare i codici di ritorno per errori. I codici di errore sono facilmente mascherati, ignorati, dimenticati. Se c'è un errore, gestiscilo o propagalo nello stack superiore.
-
Nei casi in cui è previsto che un metodo restituisca un errore e l'errore non sia eccezionale, utilizzare le enumerazioni, mai numeri di errore. Esempio:
// Note that the operation fails pretty often, since it deals with the servers which are
// frequently unavailable, and the ones which send garbage instead of the actual data.
private LoadOperationResult LoadProductsFromWeb()
{
...
}
Il significato di LoadOperationResult.ServerUnavailable
, LoadOperationResult.ParsingError
, ecc. è molto più esplicito di, ad esempio, ricordando che il codice 12 significa che il server è inattivo e il codice 13 che i dati non possono essere analizzati.
-
Usa i codici di errore quando si riferiscono a quelli comuni, conosciuti da ogni sviluppatore che lavora nel dominio specifico. Ad esempio, non reinventare un valore enum per HTTP 404 Not Found o HTTP 500 Internal Server Error.
-
Attenzione ai booleani. Prima o poi, vorrai sapere non solo se un metodo specifico è riuscito o meno, ma perché. Le eccezioni e le enumerazioni sono molto più potenti per questo.
-
Non catturare tutte le eccezioni (a meno che tu non sia in cima alla pila). Se noti un'eccezione, dovresti essere pronto a gestirlo. La cattura di tutto sta dimostrando che non ti interessa se il tuo codice funziona correttamente. Questo potrebbe risolvere il problema "Non voglio cercare subito come risolvere questo problema", ma prima o poi ti farò male.
-
In C #, mai rilanciare eccezioni come questa:
catch (SomeException ex)
{
...
throw ex;
}
perché stai rompendo lo stack. Fatelo invece:
catch (SomeException)
{
...
throw;
}
-
Fai uno sforzo durante la scrittura di messaggi di eccezione. Quante volte ho visto qualcosa come throw Exception("wrong data")
o throw Exception("shouldn't call this method in this context")
. Altri sviluppatori, incluso te stesso sei mesi dopo, non avrebbero idea di quali dati siano sbagliati e perché o perché non dovremmo chiamare qualche metodo in un contesto, né quale contesto preciso.
-
Non mostrare messaggi di eccezione all'utente. Non sono previsti per le persone comuni e spesso sono illeggibili anche per gli sviluppatori stessi.
-
Non localizzare messaggi di eccezione. Cercare la documentazione per un messaggio localizzato è estenuante e inutile: ogni messaggio dovrebbe essere solo in inglese e inglese.
-
Non concentrarti esclusivamente su eccezioni ed errori: anche i log sono estremamente importanti.
-
In .NET, non dimenticare di includere le eccezioni nella documentazione XML del metodo:
/// <exception cref="MyException">Description of the exception</exception>
Includere le eccezioni nella documentazione XML rende le cose molto più semplici per la persona che usa la libreria. Non c'è niente di più fastidioso di cercare di indovinare quale eccezione potrebbe essere generata da un metodo e perché.
In questo senso¹, gestione delle eccezioni Java offre un approccio più rigoroso e migliore . Ti costringe a gestire le eccezioni potenzialmente generate dai metodi chiamati, o dichiara nel tuo metodo che può lanciare le eccezioni che non gestisci, rendendo le cose particolarmente trasparenti.