Comment attribuez-vous les codes d'erreur?

13

Comment, lors du développement d'un projet de taille moyenne, identifiez-vous, créez-vous et maintenez-vous des codes d'erreur?

Pour ma vie, je ne peux pas penser à une méthode simple et propre de le faire. Certaines de mes idées convertissent les noms de classe et le nom de méthode en une chaîne entière, mais c'est trop long à afficher à l'utilisateur en plus du fait que les noms de méthode et les noms de classe peuvent changer (heureusement pas!). D'autres utilisent simplement un système de journalisation incrémentiel (c.-à-d. Chaque fois que je crée un nouveau message d'erreur, ajoutez simplement 1 au dernier identifiant de message d'erreur). Mais ce n'est tout simplement pas organisé.

Pour être plus précis, je parle de code d'erreur comme:

Error 401 Unauthorized.

ahodder
la source
1
codes d'erreur? Comme des "nombres magiques"? Par exemple ... ERREUR 001. Ensuite, vous allez dans une liste et lisez ERREUR 001 signifie que bla bla bla ... Oui?
wleao
@wleao - Yessir. Je vais modifier ma question pour englober cela. Je vous remercie.
ahodder
Comme vous l'avez modifié dans votre question. Regardez comment ils le font avec http. Je ne sais pas si c'est une bonne idée d'utiliser des nombres magiques. Cependant, si vous êtes vraiment prêt à le faire, suivez leurs concepts. Par exemple, ils ont une taxonomie d'erreurs (l'avez-vous?).
wleao
@wleao - pas encore, mais grâce à vous et Péter Török, je vais certainement en créer un. :)
ahodder

Réponses:

16

Non.

Les codes d'erreur sont un anachronisme, ils proviennent de l'époque où la sortie était vraiment difficile et coûteuse, et la seule façon de signaler une condition d'erreur peut avoir été à travers un tas de voyants du panneau avant: panneau avant pdp11 / 70

De nos jours, nous avons une gestion des exceptions mature intégrée dans à peu près tous les langages traditionnels. Utilise le. Donnez à l'utilisateur les informations avec lesquelles il peut travailler; ne les dérangez pas avec des bla blas techniques, mais dites-leur plutôt ce qui s'est mal passé et ce qu'ils peuvent faire à ce sujet. Pour la journalisation, donnez simplement à vos exceptions des noms descriptifs et enregistrez le nom. Plus facile à mémoriser et aussi plus facile à trouver en utilisant grep ou des outils de recherche similaires.

L'exception est, bien sûr, lorsque vous programmez pour des situations où la sortie est toujours difficile et coûteuse, comme les systèmes intégrés ou les protocoles réseau. HTTP utilise toujours des codes de réponse numériques car ils sont extrêmement faciles à analyser efficacement - dans certaines situations, lire uniquement le premier chiffre peut déjà vous en dire assez, et vous pouvez jeter le reste du paquet.

tdammers
la source
Merci pour la réponse détaillée, qui a beaucoup de sens et c'est bon à savoir.
ahodder
Votre utilisation de l'illustration correspond parfaitement à votre argument. J'ai lu pour toujours sur PDP-11. Mais c'est en fait le premier que j'aie jamais vu. Merci.
Mike Owens
2
À l'intérieur du code, je préfère gérer un code d'erreur et je ne suis pas si vieux.
JeffO
@Jeff: Tout ce que vous pouvez faire avec des codes d'erreur peut également être fait avec des exceptions, puis un peu plus. Si vous souhaitez imiter les codes d'erreur avec des exceptions, tout ce que vous avez à faire est de lancer au lieu de renvoyer le code d'erreur et d'attraper au lieu de comparer la valeur de retour avec E_OK (ou quelle que soit la réponse OK). Pour être juste cependant, C n'a pas de vraies exceptions, et les longs sauts ne sont pas aussi pratiques, donc si vous faites C, vous êtes quelque peu excusé.
tdammers
@Mike: L'image provient de l'article de wikipedia sur la série PDP-11; si ce n'est pas facile à trouver, je ne sais pas ce que c'est.
tdammers
6

Vous devriez vérifier comment les codes d'erreur / d'état sont organisés dans des protocoles courants tels que HTTP . Ils réservent des plages distinctes pour différents types de statuts / erreurs. Cela permet aux utilisateurs d'identifier plus facilement un code d'état inconnu et aux développeurs d'attribuer un code pour un nouveau type d'erreur qui n'a pas été traité auparavant.

Péter Török
la source
Ajoutez à votre réponse la question de la taxonomie. Cela facilitera la gestion et la maintenance des erreurs.
wleao
3

Désolé, pourquoi utiliser des codes d'erreur?
Saisissez l'exception, connectez-vous et proposez d'envoyer un rapport si le programme ne peut pas récupérer .

(En supposant que votre langue prend en charge les exceptions.)

La seule information pertinente qui pourrait vous aider à corriger le bogue est la trace de pile que vous n'obtenez pas avec un code d'erreur. (Je suppose également que vous souhaitez utiliser des codes d'erreur pour les rapports d'erreur et ne pas les jeter sur le visage d'un utilisateur.)

Dan
la source
C'est très vrai, et je le fais, mais que dirais-je aux utilisateurs? Je suis sûr qu'ils seraient livides s'ils trafiquaient et que l'application mourrait, sans explication ni quoi que ce soit.
ahodder
6
Je pense qu'il y a au moins trois choses différentes qui se confondent ici. Le premier est les codes utilisés de logiciel à logiciel, comme dans HTTP. Les seconds sont des codes que les utilisateurs peuvent utiliser dans un rapport d'erreur (comme les numéros d'incident). Les derniers sont des messages qui peuvent être montrés à l'utilisateur. Il peut être utile de les considérer comme des choses distinctes.
Darien
2
L'une des principales raisons d'utiliser des codes d'erreur est lorsque vous créez une application principale. Il est beaucoup plus facile et plus élégant pour un programme client d'interpréter et de répondre à un code qu'à un message d'erreur ou une trace de pile. Toutes les erreurs ne proviennent pas de bogues.
Kaypro II
1
Les exceptions sont très difficiles à corriger! Voir les liens dans: programmers.stackexchange.com/questions/97874/…
Codeur
@Coder: votre exemple abuse des exceptions. Vous devriez attraper ce que vous attendez d'être jeté . La plupart des méthodes n'ont pas besoin d'attendre qu'une seule exception soit levée. C'est la responsabilité du programmeur de décider quoi gérer et je suis d'accord qu'il peut être difficile de bien faire les choses .
Dan
2

Je vais supposer un contexte procédural (C). Si vous avez des objets, un objet d'erreur est généralement préférable, qu'il s'agisse d'exception ou non.

Vous devez utiliser des codes d'erreur locaux pour chaque module. Pour une bibliothèque, vous pouvez avoir un en-tête spécial répertoriant les codes d'erreur, avec le numéro 1, 2, etc. (ou -1, -2 si vous préférez). Assurez-vous de toujours renvoyer l'un de ces codes, par exemple traduire errnodans vos propres codes. Si vous avez plusieurs couches de modules, traduisez à chaque étape (ou prédéfinissez une plage pour l'erreur plus profonde, par exemple les valeurs 1001 - 1050 proviennent de cet autre module).

Il est également important de fournir un moyen de traduire le code en chaîne. Vous ne devez jamais signaler uniquement le code, cela ne mène qu'à la frustration. En fait, à peu près n'importe quel code dans votre application devrait être fourni avec une fonction de traduction de chaînes. Par exemple, libc a généralement strerroret strsignal, mais manque malheureusement strwaitstatus.

Per Johansson
la source
détail fantastique, merci. C'est vraiment très utile.
ahodder