79 votes

Objective-C: Assertion vs. Exception vs. Erreur

Dans le Cacao, quand dois-je utiliser NSAssert, NSException, NSError?

Voici ce que j'ai pensé:

NSAssert - Lors de la création de tout programme client utilisé pour les programmeurs profit de vérifier les règles, les conventions, les hypothèses, ou de pré-conditions et post-conditions?

NSException - Lors de la création d'une bibliothèque tierce, pour le bénéfice d'autres programmeurs qui utilisent la bibliothèque, de sorte qu'ils ont immédiatement savoir quand une entrée est invalide?

NSError - Lors de l'interfaçage avec un système externe pour obtenir les données comme un fichier, base de données, ou d'un service web qui n'est pas garanti pour me donner raison?

P. S. Si c'est un doublon mes excuses, je n'ai vu à ce sujet dans le contexte de Java et C#.

101voto

Mike Weller Points 28387

Un NSAssert lèvera une exception quand il échoue. Donc NSAssert est là pour être court et facile à écrire et à vérifier toutes les hypothèses que vous avez faites dans votre code. Il n'est pas (à mon avis) une alternative à des exceptions, juste un raccourci. Si une assertion échoue alors quelque chose a terriblement mal tourné dans votre code et le programme ne doit pas continuer.

Une chose à noter est que NSAssert ne sera pas compilé dans votre code dans un communiqué, alors il est généralement utilisé pour les vérifications en cours de développement. J'ai effectivement tendance à utiliser une coutume d'affirmer macro qui est toujours active.

La fois de vous serait - @throw votre propre NSException sont quand vous voulez certainement dans un communiqué de construire, et d'autres choses, comme les bibliothèques publiques/de l'interface lors de certains arguments sont invalides ou vous avez été appelés à tort. Notez qu'il n'est pas vraiment pratique courante de @catch une exception et poursuivre l'exécution de votre application. Si vous essayez cela avec certains d'Apple bibliothèques standard (par exemple de Base de Données) de mauvaises choses peuvent arriver. Semblable à une assertion, si une exception est levée, l'application doit généralement mettre fin assez rapidement, car elle signifie qu'il y a une erreur de programmation, quelque part.

NSErrors doit être utilisé dans vos bibliothèques/interfaces pour les erreurs qui ne sont pas des erreurs de programmation, et qui peut être récupéré à partir de. Vous pouvez fournir des informations/codes d'erreur de l'appelant et qu'ils peuvent gérer l'erreur proprement, alerte l'utilisateur le cas échéant, et continuer l'exécution. Ce serait généralement pour des choses comme un Fichier n'est pas trouvé d'erreur ou de quelque autre erreur non fatale.

3voto

Jens Ayton Points 11566

La convention de Cacao est qu'une exception indique une erreur du développeur. Beaucoup de code, y compris le cadre du code, n'est pas conçu pour fonctionner correctement après qu'une exception est levée.

Toute sorte d'erreur qui doit être recouvrable est représenté par un NSError. Il y a également un système pour la présentation de l' NSErrors à l'utilisateur. Comme vous le dites, c'est surtout utile pour faillible ressources externes.

Sur le plan conceptuel, une affirmation est une déclaration qu'un prédicat renvoie toujours true; si ça ne marche pas, le programme est cassé. Alors que son comportement peut être modifié, l' NSAssert famille est par défaut un moyen pratique de lancer des NSInternalInconsistencyExceptions (avec la possibilité de les désactiver dans les versions release).

2voto

likid1412 Points 51

Edit: Dans Xcode 4.2, les assertions sont désactivés par défaut pour les versions release,

Maintenant NSAssert ne sera pas compilé dans votre code dans un communiqué de construire, mais vous pouvez le changer dans les paramètres de construction de la


@Mike Weller, Il y a un mal dans votre réponse.

Une chose à noter est que NSAssert ne sera pas compilé dans votre code dans un communiqué de construire, c'est donc généralement utilisé pour les vérifications en cours de développement.

En fait, NSAssert sera compilé dans votre code si vous n'ajoutez pas d' NS_BLOCK_ASSERTIONS dans votre précompilés préfixe des fichiers.

Dans la Note Technique TN2190 nous pouvons trouver:

Macros comme NDEBUG pour éteindre C affirmer ou NS_BLOCK_ASSERTIONS pour désactiver la Fondation NSAssert sont importants pour spécifier pour votre précompilés préfixe des fichiers

Ou vous pouvez lire celui-ci:Comment savoir si NSAssert est désactivé dans les versions release?

1voto

Chuck Points 138930

En général, les exceptions sont utilisées pour signaler les erreurs du développeur - ils sont des choses qui ne devrait pas arriver. Les erreurs sont utilisés pour signaler des conditions d'erreur qui pourraient survenir dans le fonctionnement normal du programme - les erreurs de l'utilisateur, pour l'essentiel, ou les conditions externes qui ont besoin d'être vrai, mais peut-être pas. Donc, essayez de supprimer certains verrouillé élément dans un document peut être une erreur, et j'essaie de télécharger un fichier sans une connexion à Internet serait une erreur, mais en essayant d'accéder à un élément non valide dans une collection serait une exception.

Les Assertions sont généralement utilisés dans les tests, et autant que je sache, ne sont pas utilisés comme un mécanisme de gestion des erreurs comme les autres.

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