66 votes

Exception Vs Assertion

Quelle est la différence entre la gestion des exceptions java et l’affirmation d’une condition quelconque?

son savoir que assert est de deux types.

98voto

Jon Skeet Points 692016

Utilisez les assertions de la logique interne des contrôles au sein de votre code, et normal des exceptions pour les conditions d'erreur à l'extérieur de votre code de contrôle.

N'oubliez pas que les assertions peuvent être activés et désactivés - si vous pensez à des choses comme la validation d'arguments, qui doivent être explicites à l'aide d'exceptions. (Vous pouvez toutefois choisir d'effectuer la validation d'arguments sur privé méthodes utilisant des assertions, au motif qu'une infraction à ce point est dû à un bug interne plutôt que d'une erreur externe.)

Sinon c'est toute raisonnable (OMI) pour utiliser les exceptions pour tout. Personnellement, je ne pas utiliser les assertions beaucoup à tous, mais c'est une question de préférence personnelle, dans une certaine mesure. (Il peut certainement être objectif arguments pour et contre des assertions, mais il n'est pas suffisamment claire pour enlever la préférence au total.)

28voto

Stephen C Points 255558

Java affirmations sont construites au-dessus de Java exceptions et la gestion des exceptions. En effet, lorsqu'un Java assertion échoue, le résultat est un AssertionError exception qui peut être pris comme toute autre exception Java. Les principales différences entre les exceptions et les affirmations sont:

  • Les affirmations sont destinés à être utilisés uniquement comme un moyen de détecter des erreurs de programmation, aka bugs. En revanche, une exception peut indiquer d'autres types d'erreur ou "exceptionnel" condition; par exemple, l'entrée utilisateur non valide, fichiers manquants, des tas plein et ainsi de suite.
  • Le langage Java fournit syntaxique de soutien pour les assertions, dans la forme de l' assert déclaration. Comparer les suivantes:
 if (x != y) {
 throw new SomeException (x != y");
}

 assert x != y;
  • Plus important encore, Java permet d'activer ou de désactiver l'affirmation de la vérification à l'échelle mondiale ou sur les classes lorsque vous démarrez la machine virtuelle java.

Note: certaines personnes disent que vous devez toujours exécuter le code de production avec l'affirmation de la vérification éteint. J'ai tendance à être en désaccord avec cela comme une déclaration générale. Si votre code de production est connue pour être stable ET vous avez besoin de serrer les dernières tranches de rendement hors de lui, puis en éteignant des assertions est bon. Mais, si un (dire) 10% de gain de performance n'est pas un réel problème, je préfère avoir une application de mourir avec une erreur d'assertion si l'alternative est de continuer et de corrompre ma base de données.

EDIT: @Mario Ortegón a commenté ainsi:

La "mise hors tension" à cause de l' les assertions peuvent être utilisés pour vérifier l' résultat d'un algorithme optimisé par la comparaison de sa mise en œuvre à l'encontre d'un le bien-connu, mais lente, de l'algorithme. Donc, dans le développement, il est OK pour invoquer que O(N^3) méthode d'affirmer que l' O(log N) l'algorithme fonctionne comme prévu. Mais ce est quelque chose que vous ne voulez pas dans de production.

Si oui ou non vous pensez que c'est une bonne pratique pour éteindre les assertions de production, il est certainement une mauvaise pratique pour écrire des assertions qui ont un impact significatif sur les performances lorsqu'il est activé. Pourquoi? Car cela signifie que vous n'avez plus la possibilité de permettre à des affirmations de la production (à retrouver la trace d'un problème) ou dans votre stress / test de capacité. À mon avis, si vous avez besoin d' O(N^3) pré/post-condition de test, vous devez le faire dans vos tests unitaires.

6voto

Firstthumb Points 1604

Exception est un mécanisme de vérifier si la mise en œuvre est en cours d'exécution sans aucune attendus ou inattendus, des erreurs ou pas. Ainsi, nous voyons que les exceptions sont utilisés essentiellement pour la manipulation de même les conditions imprévues au cours de l'exécution d'une application dans une meilleure façon, et par conséquent, avec les exceptions de manière efficace les résultats dans une application robuste.

Les Assertions ne devrait jamais être une partie de la mise en œuvre de certaines fonctionnalités de l'application. Ils devraient seulement être utilisés pour vérifier les hypothèses - juste pour être sûr que ce que nous avons supposé tandis que la conception de la solution est en fait valable dans la pratique ainsi.

référence: http://geekexplains.blogspot.com/2008/06/asserions-in-java-assertions-vs.html

4voto

Tim Abell Points 2301

Exemple d'une bonne utilisation de l'herbicide Assert:

assert flibbles.count() < 1000000; // too many flibbles indicate something is awry
log.warning("flibble count reached " + flibbles.count()); // log in production as early warning

Personnellement, je pense qu'Affirmer devrait seulement être utilisé quand vous savez que quelque chose est à l'extérieur souhaitable limites, mais vous pouvez être sûr qu'il est raisonnable de continuer. Dans tous les autres cas (n'hésitez pas à souligner les circonstances je n'ai pas pensé) utiliser les exceptions à l'échec dur et rapide.

La clé de compromis pour moi est de savoir si vous voulez ramener un live/système de production avec une Exception pour éviter la corruption et faciliter le dépannage, ou si vous avez rencontré une situation qui ne devrait jamais être autorisé à poursuivre inaperçu dans test/debug versions, mais pourrait être autorisé à poursuivre dans la production (de l'enregistrement d'un avertissement bien sûr).

cf. http://c2.com/cgi/wiki?FailFast voir aussi mon c# copie de cette réponse: Debug.Affirmer vs Spécifiques Exceptions lancées

1voto

Lliane Points 566

Assert est uniquement à des fins de débogage et sa condition de déclenchement ne doit pas se produire (pointeur null lorsqu'il ne devrait pas y en avoir, etc.)

Une exception concerne les événements système spéciaux qui peuvent toujours se produire: FileNotFound, ConnectionToServerLost, etc.

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