2010-02-07 20 views
4

Actuellement, je retourne -1 dans mes fonctions personnalisées en C si quelque chose ne va pas et 0 pour le succès. Par exemple, travailler avec une liste chaînée et certaines fonctions nécessite une liste non vide pour fonctionner correctement. Si la liste passée en argument est vide, je renvoie -1 (erreur) et 0 si elle n'est pas vide et que la fonction a fonctionné sans problème.Que devrais-je retourner pour des erreurs dans mes fonctions en C?

Devrais-je, peut-être, retourner 1 au lieu de -1?

Est-ce la façon habituelle de faire les choses en C ou recommandez-vous une approche différente?

Répondre

8

Renvoie une valeur non nulle pour indiquer un échec. De cette façon, vous pouvez vous écrire des fonctions appels comme si:

if(func_call()) 
{ 
    doErrorHandling(); 
} 

Cette convention vous permettra d'utiliser une valeur !0 pour indiquer une erreur spécifique, et cela vous permettra d'utiliser une variable d'une manière uniforme. Ainsi, le corps du if montré dans l'exemple ci-dessus peut alors avoir une instruction switch pour traiter les erreurs spécifiques.

Vous pouvez le faire différemment - mais si vous choisissez de le faire tenir à une convention - l'API win32 (et d'autres API de je l'ai utilisé) mélanger et conventions de match, malheureusement.

+0

Si vous n'avez pas de codes d'erreur spécifiques, vous pouvez toujours retourner un bool. –

+4

+1 ** N'a pas à être positif **, cependant, 0 pour le succès et 0 pour l'erreur est tout ce dont vous avez besoin. En fait, selon mon expérience, il est plus fréquent que les codes d'erreur soient négatifs. –

+0

@Steve: Dans certains langages/environnements qui seraient appropriés, mais pas C. Le 0 = succès est tellement ancré dans la culture C que vous avez besoin d'une raison * vraiment bonne * pour faire autre chose. –

-5

Il existe de nombreux modèles - mais quoi que vous fassiez, faites-le de manière cohérente!

Si vous n'avez pas beaucoup de conditions défaillantes, utilisez simplement 0 pour l'erreur. En effet, les tests d'erreur sont écrits de manière simple:

if (!list_insert(...)) { handle_error; } 

Sinon réponses ci-dessous de zéro sont bonnes à utiliser ainsi que les réponses normales> = 0. Vous pouvez l'utiliser pour des fonctions telles que la longueur de la liste, qui dans des conditions normales, ne pas être négatif. Ou si vous voulez beaucoup de codes d'erreur (-1 - couinent, -2 - pas trouvé, -3 ..., ...)

+1

N'utilisez pas 0 pour l'erreur. C a un historique très, très fort de 0 = succès,! 0 = échec. Comme l'a souligné Hassan Syed, l'incapacité des concepteurs de l'API Windows à reconnaître ce fait n'a pas mis fin à la confusion. –

+0

Je ne vois pas de gros problème dans les deux cas. Certains projets font 0 == échec et d'autres réussissent 0 ==. Tant que cela est documenté et que vous restez à la même convention tout au long du projet - aucun moyen n'est "faux". Pour moi, c'est plus facile à lire - "if not list_insert", ce qui signifie que list_insert a échoué. Sauf si vous vous attendez à ce que vos fonctions échouent la plupart du temps ... Hassan a également fait remarquer qu'ils mélangent et assortissent différentes manières, (pas qu'ils utilisent 0 == erreur) et fondamentalement dit la même chose que j'ai commencé - quoi que vous fassiez, respectez-le. – viraptor

2

Cela sonne bien. -1 est utilisé dans la fonction d'E/S, car une valeur de retour positive signifie généralement succès et nombre d'octets traités. Si vous avez plusieurs possibilités, une fonction peut mal tourner, vous pouvez alors renvoyer des entiers différents ou définir une variable d'erreur globale (errno est utilisée par la bibliothèque standard) pour contenir le code d'erreur.

En termes de style, je préfère ne pas retourner les codes d'état, car cela signifie mes fonctions ne peuvent pas (proprement) retourner quoi que ce soit d'autre. Au lieu de cela, je vérifierais l'entrée avant d'appeler la fonction. Mais ceci est subjectif et dépend du contexte.

-1

Je suggère que vous trouviez un moyen de formater une chaîne entièrement informative et lisible par l'homme au point de l'erreur, où toutes les informations sont encore disponibles, et de concevoir un moyen de le faire descendre à travers le reste de la programme, à travers l'utilisateur, son téléphone mobile, à votre équipe de développement pour l'analyse.

Cela me semble comme une caractéristique importante de toute conception, si vous voulez produire de meilleurs logiciels plus rapidement. Tuer des informations d'erreur sur le chemin est un crime majeur, et le langage C n'est pas une excuse.

+0

Entièrement informatif à qui - l'utilisateur final, ou le développeur ??? Et dans quelle langue ??? –

+0

Entièrement informatif pour le développeur, bien sûr. Lisez ma réponse à nouveau. Langue: en anglais. Les développeurs devraient comprendre l'anglais. Les utilisateurs/helpdesks devraient pouvoir essayer de le transmettre à l'équipe. –