116 votes

Meilleures pratiques - domaines de NSError et de codes pour votre propre projet/app

Il y a un précédent post DONC en rapport avec la mise en place d'erreur domaines pour vos propres cadres, mais quelle est la meilleure pratique en rapport avec la mise en place d'erreur domaines et des codes d'erreur personnalisé pour votre propre projet/app?

Par exemple, supposons que vous travaillez sur une Base de Données intensives en application avec beaucoup de validations, devrait simplement s'en tenir à la "off the shelf" Base de Données des codes d'erreur (comme NSManagedObjectValidationError de CoreDataErrors.h) ou devriez-vous créer votre propre MyAppErrors.h et de définir des erreurs avec plus de spécificité (c'est à dire, MyAppValidationErrorInvalidCombinationOfLimbs?

La création d'un message d'erreur personnalisé de domaine et un ensemble de codes d'erreur pourrait considérablement lever l'ambiguïté de votre code, mais est-ce trop compliqué de maintenir et de n'avoir à vous soucier de code d'erreur de numérotation des conflits? Ou il y en a d'autres préoccupations?

Merci

152voto

Dave DeLong Points 156978

Personnellement, je utiliser un reverse-DNS style de domaine. Par exemple:

NSError * myInternalError = [NSError errorWithDomain:@"com.davedelong.myproject" code:42 userInfo:someUserInfo];

La troisième partie du domaine (@"myproject") est utilisée pour différencier les erreurs de ce projet ("My Project") des erreurs dans un autre projet ("My Other Project" => com.davedelong.myotherproject).

C'est un moyen simple de s'assurer que je ne vais pas en conflit avec quelqu'un d'autre erreur domaines (si je suis en utilisant la 3ème partie du code), à moins que le développeur est à dessein d'essayer de jouer avec juste moi (qui je pense serait très peu probable...).

Comme pour le code de numérotation des conflits, ne vous inquiétez pas à ce sujet. Aussi longtemps que les codes sont uniques au sein d'un domaine, vous devriez être OK.

Comme pour la traduction des erreurs, c'est à vous. Quoi que vous fassiez, assurez-vous de le documenter. Personnellement, j'ai l'habitude de simplement passer sur cadre-généré des erreurs comme ils sont venus à moi, puisque je ne suis jamais tout à fait sûr que je vais gérer tous les codes et les traduire toutes les userInfo en quelque chose de plus spécifique à mon projet. Les cadres pouvaient modifier et ajouter d'autres codes, ou de changer la signification des codes existants, etc. Il m'aide aussi plus spécifiquement à identifier où l'erreur provient. Par exemple, si mon StackKit cadre génère une erreur dans l' com.stackkit de domaine, je sais que c'est un cadre de problème. Toutefois, si elle génère une erreur dans l' NSURLErrorDomain, alors je sais qu'il est venu spécialement à partir de l'URL mécanisme de chargement.

Ce que vous pourriez faire est de capturer le cadre d'erreur générés et l'envelopper dans une nouvelle erreur de l'objet qui a votre nom de domaine et un code générique, quelque chose comme kFrameworkErrorCodeUnknown ou quelque chose, et puis lieu de la capture d'erreur dans l' userInfo sous l' NSUnderlyingErrorKey. CoreData n'est-ce beaucoup (par exemple, si vous essayez d' save: un NSManagedObjectContext, mais vous avez de la relation de l'intégrité des erreurs, vous obtiendrez une seule erreur, mais l' NSUnderlyingErrorKey contiennent beaucoup plus d'informations, comme précisément les relations sont mauvaises, etc).

37voto

Vare Points 61

Je n’ai pas assez rep à commenter, mais pour la réponse acceptée par Dave DeLong, il pourrait être un peu mieux utiliser au lieu de . De cette façon, si vous modifiez votre nom ou nom du projet, qui figurera avec précision.

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