Utilisez des exceptions pour des choses exceptionnelles, des choses que vous ne pouvez raisonnablement pas vous attendre à rencontrer trop souvent, des choses qui indiquent que quelque chose ne va pas. Par exemple, si le réseau est en panne, c'est une chose exceptionnelle pour un serveur web. Si la base de données n'est pas disponible, cela signifie que quelque chose ne va pas. Si le fichier de configuration est manquant, cela signifie probablement que l'utilisateur s'est trompé avec lui.
N'utilisez pas d'exceptions pour gérer un code incorrect. Afin de vérifier l'exactitude du code, vous devez utiliser soit les assertions, soit, dans .NET Framework 4 et versions ultérieures, les contrats de code (qui remplacent les assertions et présentent des fonctionnalités supplémentaires particulièrement utiles).
N'utilisez pas d'exceptions dans des cas non exceptionnels. Le fait que l'utilisateur, lorsqu'on lui a demandé d'entrer un numéro, a saisi "chien" n'est pas si exceptionnel qu'il mérite une exception.
Soyez prudent lorsque vous choisissez les types d'exceptions. Créez vos propres types si nécessaire. Choisissez soigneusement l'héritage, en gardant à l'esprit que les parents attrapeurs attraperont également les enfants. Jamais throw Exception
.
N'utilisez pas de codes retour pour les erreurs. Les codes d'erreur sont facilement masqués, ignorés, oubliés. S'il y a une erreur, gérez-la ou propagez-la dans la pile supérieure.
Dans les cas où une méthode devrait renvoyer une erreur et que l'erreur n'est pas exceptionnelle, utilisez des énumérations, jamais des numéros d'erreur. Exemple:
// 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()
{
...
}
Le sens de LoadOperationResult.ServerUnavailable
, LoadOperationResult.ParsingError
etc. est beaucoup plus explicite que, disons, se souvenant que le code 12 signifie que le serveur est en panne, et le code 13 - que les données ne peuvent pas être analysées.
Utilisez des codes d'erreur lorsqu'ils font référence aux codes communs, connus de tous les développeurs qui travaillent dans le domaine spécifique. Par exemple, ne réinventez pas une valeur d'énumération pour HTTP 404 Not Found ou HTTP 500 Internal Server Error.
Méfiez-vous des booléens. Tôt ou tard, vous voudrez non seulement savoir si une méthode spécifique a réussi ou échoué, mais pourquoi. Les exceptions et énumérations sont beaucoup plus puissantes pour cela.
N'attrapez pas toutes les exceptions (sauf si vous êtes tout en haut de la pile). Si vous interceptez une exception, vous devez être prêt à la gérer. Tout attraper montre que vous ne vous souciez pas si votre code fonctionne correctement. Cela peut résoudre le problème "Je ne veux pas chercher maintenant comment résoudre ce problème", mais cela vous blessera tôt ou tard.
En C #, ne renvoyez jamais d'exceptions comme celle-ci:
catch (SomeException ex)
{
...
throw ex;
}
parce que vous cassez la pile. Faites ceci à la place:
catch (SomeException)
{
...
throw;
}
Faites un effort lors de l'écriture de messages d'exception. Combien de fois j'ai vu quelque chose comme throw Exception("wrong data")
ou throw Exception("shouldn't call this method in this context")
. D'autres développeurs, y compris vous-même six mois plus tard, n'auraient aucune idée des données erronées et pourquoi ou pourquoi ne devrions-nous pas appeler une méthode dans un contexte, ni quel contexte précisément.
N'affichez pas les messages d'exception à l'utilisateur. Ils ne sont pas attendus pour les gens ordinaires et sont souvent même illisibles pour les développeurs eux-mêmes.
Ne localisez pas les messages d'exception. La recherche dans la documentation d'un message localisé est épuisante et inutile: chaque message doit être en anglais et en anglais uniquement.
Ne vous concentrez pas exclusivement sur les exceptions et les erreurs: les journaux sont également extrêmement importants.
Dans .NET, n'oubliez pas d'inclure des exceptions dans la documentation XML de la méthode:
/// <exception cref="MyException">Description of the exception</exception>
L'inclusion d'exceptions dans la documentation XML facilite grandement les choses pour la personne qui utilise la bibliothèque. Il n'y a rien de plus ennuyeux que d'essayer de deviner quelle exception pourrait être levée par une méthode et pourquoi.
En ce sens¹, la gestion des exceptions Java offre une approche plus stricte et meilleure. Il vous oblige soit à traiter les exceptions potentiellement levées par les méthodes appelées, soit à déclarer dans votre propre méthode qu'il peut lever les exceptions que vous ne gérez pas, ce qui rend les choses particulièrement transparentes.