135 votes

Conventions pour les exceptions ou les codes d'erreur

Hier, j'ai eu un débat animé avec un collègue sur la méthode à privilégier pour signaler les erreurs. Nous discutions principalement de l'utilisation des exceptions ou des codes d'erreur pour signaler les erreurs entre les couches ou les modules de l'application.

Quelles règles utilisez-vous pour décider si vous lancez des exceptions ou renvoyez des codes d'erreur pour le signalement des erreurs ?

87voto

Tom Dunham Points 2466

Dans le domaine du haut niveau, les exceptions ; dans le domaine du bas niveau, les codes d'erreur.

Le comportement par défaut d'une exception est de dérouler la pile et d'arrêter le programme, si j'écris un script an et que je vais chercher une clé qui n'est pas dans un dictionnaire, c'est probablement une erreur, et je veux que le programme s'arrête et me fasse savoir tout cela.

Si, cependant, j'écris un morceau de code que je doit savoir le comportement de dans toutes les situations possibles, alors je veux des codes d'erreur. Sinon, je dois connaître toutes les exceptions qui peuvent être déclenchées par chaque ligne de ma fonction pour savoir ce qu'elle fera. L'exception qui a cloué au sol une compagnie aérienne pour avoir une idée de la difficulté de la tâche). Il est fastidieux et difficile d'écrire un code qui réagit de manière appropriée à chaque situation (y compris les situations malheureuses), mais c'est parce qu'écrire un code sans erreur est fastidieux et difficile, et non parce que vous passez des codes d'erreur.

Les deux sites Raymond Chen y Joel ont présenté des arguments éloquents contre l'utilisation d'exceptions pour tout.

1 votes

J'ai trouvé deux de ces messages très intéressants (je n'ai pas lu le "et"), mais, en particulier pour le message de Raymond, il était difficile de dire dans quelle mesure il était vraiment agnostique du point de vue du langage. Je pense que vous pourriez écrire un argument tout aussi éloquent en faveur de l'utilisation des exceptions plutôt que des codes d'erreur.

5 votes

+1 pour avoir souligné que le contexte a quelque chose à voir avec la stratégie de traitement des erreurs.

3 votes

@Tom, Bons points, mais les exceptions sont garanties d'être attrapées. Comment pouvons-nous nous assurer que les codes d'erreur sont attrapé et non pas ignorés en silence à cause d'erreurs ?

67voto

smink Points 39640

Je préfère normalement les exceptions, car elles contiennent plus d'informations contextuelles et peuvent transmettre (lorsqu'elles sont correctement utilisées) l'erreur au programmeur de manière plus claire.

D'autre part, les codes d'erreur sont plus légers que les exceptions mais sont plus difficiles à maintenir. La vérification des erreurs peut être omise par inadvertance. Les codes d'erreur sont plus difficiles à maintenir car il faut tenir un catalogue avec tous les codes d'erreur et ensuite activer le résultat pour voir quelle erreur a été lancée. Les plages d'erreurs peuvent être utiles ici, car si la seule chose qui nous intéresse est de savoir si nous sommes en présence d'une erreur ou non, il est plus simple de vérifier (par exemple, un code d'erreur HRESULT supérieur ou égal à 0 est un succès et inférieur à zéro est un échec). Ils peuvent être omis par inadvertance car il n'y a pas de forçage programmatique pour que le développeur vérifie les codes d'erreur. D'autre part, vous ne pouvez pas ignorer les exceptions.

Pour résumer, je préfère les exceptions aux codes d'erreur dans presque toutes les situations.

4 votes

"Les codes d'erreur sont plus légers que les exceptions" dépend de ce que vous mesurez et de la manière dont vous le faites. Il est assez facile de proposer des tests qui montrent que les API basées sur les exceptions sont beaucoup plus rapides.

0 votes

@MooingDuck, C'est impossible, à moins que ces tests soient injustes/biaisés. Vous prétendez effectivement qu'il existe un environnement qui manipule les objets et les chaînes de caractères plus efficacement qu'il ne manipule les chiffres. Définitivement possible mais qui n'a rien de banal.

2 votes

@smink, Bons points, mais comment aborder l'overhead des exceptions ? Les codes d'erreur ne sont pas seulement légers, ils sont essentiellement en apesanteur ; les exceptions ne sont pas seulement de poids moyen, elles sont lourd -des objets légers contenant des informations sur la pile et des choses diverses que nous n'utilisons pas de toute façon.

24voto

JamShady Points 2390

Je préfère les exceptions car

  • ils interrompent le flux de la logique
  • ils bénéficient de la hiérarchie des classes qui offre davantage de caractéristiques/fonctionnalités
  • lorsqu'elles sont utilisées correctement, peuvent représenter un large éventail d'erreurs (par exemple, une InvalidMethodCallException est également une LogicException, car toutes deux se produisent lorsqu'il y a un bogue dans votre code qui devrait être détectable avant l'exécution), et
  • ils peuvent être utilisés pour améliorer l'erreur (par exemple, la définition d'une classe FileReadException peut alors contenir du code pour vérifier si le fichier existe, s'il est verrouillé, etc.)

3 votes

Votre quatrième point n'est pas juste : Un état d'erreur, lorsqu'il est converti en objet, peut également contenir du code pour vérifier si le fichier existe, s'il est verrouillé, etc. Il s'agit simplement d'une variante de stackoverflow.com/a/3157182/632951

1 votes

"elles interrompent le flux de la logique". Les exceptions ont plus ou moins les effets suivants goto

0 votes

@peterchaula Il n'y a pas de mauvaises fonctionnalités, juste des abus de fonctionnalités.

23voto

Maxam Points 2682

Les codes d'erreur peuvent être ignorés (et le sont souvent !) par les appelants de vos fonctions. Les exceptions les obligent au moins à gérer l'erreur d'une manière ou d'une autre. Même si leur version de la gestion de l'erreur consiste à avoir un gestionnaire de capture vide (soupir).

1 votes

C'est vrai pour certaines langues et faux pour d'autres. Par exemple, Java vous oblige à attraper les exceptions ou à les lancer, mais il existe d'autres langages comme JavaScript ou Python où la gestion des exceptions n'est pas imposée par le langage.

17voto

Pistos Points 8997

Les exceptions sur les codes d'erreur, sans aucun doute. Les exceptions offrent les mêmes avantages que les codes d'erreur, mais aussi beaucoup plus, sans les inconvénients des codes d'erreur. Le seul inconvénient des exceptions est qu'elles entraînent un peu plus de frais généraux, mais à notre époque, ces frais généraux devraient être considérés comme négligeables pour presque toutes les applications.

Voici quelques articles qui discutent, comparent et opposent les deux techniques :

Vous y trouverez de bons liens qui vous permettront de poursuivre votre lecture.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X