Question

La plupart du temps, je vais utiliser une exception pour vérifier une condition dans mon code, je me demande quand il est un bon moment pour utiliser une assertion?

Par exemple,

Group group=null;
try{
    group = service().getGroup("abc");
}catch(Exception e){
    //I dont log error because I know whenever error occur mean group not found
}

if(group !=null)
{
    //do something
}

Pourriez-vous indiquer comment une affirmation correspond ici? Dois-je utiliser une affirmation?

Il semble que je ne l'utilise jamais assertions dans le code de production et de voir que les assertions dans les tests unitaires. Je ne sais que dans la plupart des cas, je peux utiliser pour faire exception à la vérification comme ci-dessus, mais je veux savoir de manière appropriée de le faire « professionnellement ».

Était-ce utile?

La solution

Assertions devraient être utilisés pour vérifier quelque chose qui ne devrait jamais se produire, tandis qu'une exception devrait être utilisé pour vérifier quelque chose qui pourrait se produire.

Par exemple, une fonction peut diviser par 0, donc une exception doit être utilisée, mais une affirmation pourrait être utilisée pour vérifier que le disque dur disparaît soudainement.

Une assertion arrêterait le programme de courir, mais une exception laisserait le programme en cours d'exécution continuer.

Notez que if(group != null) n'est pas une affirmation, qui est juste une condition.

Autres conseils

Hors de mon esprit (la liste peut être incomplète, et il est trop long pour tenir dans un commentaire), je dirais:

  • exceptions d'utilisation lors de la vérification des paramètres passés aux méthodes publiques ou protégées et les constructeurs
  • exceptions d'utilisation lors de l'interaction avec l'utilisateur ou lorsque vous attendez le code client pour récupérer d'une situation exceptionnelle
  • exceptions d'utilisation pour résoudre les problèmes qui pourraient survenir
  • assertions d'utilisation lors de la vérification des conditions préalables, post-conditions et invariants de code privé / interne
  • assertions de fournir une rétroaction pour vous ou votre équipe de développeurs
  • assertions d'utilisation lors de la vérification des choses qui sont très peu susceptibles de se produire autrement, cela signifie qu'il ya un sérieux fl aw dans votre application
  • affirmations d'utilisation de dire les choses que vous (soi-disant) savons être vrai

En d'autres termes, les exceptions traitent la robustesse de votre application en affirmations portent sur son exactitude.

Assertions sont conçus pour être pas cher pour écrire, vous pouvez les utiliser presque partout et je suis en utilisant cette règle de base: plus une déclaration d'assertion semble stupide, plus il est précieux et plus d'informations qu'il intègre. Lors du débogage d'un programme qui ne se comporte pas de la bonne façon, vous allez sûrement vérifier les possibilités d'échec les plus évidentes en fonction de votre expérience. Ensuite, vous vérifierez des problèmes qui ne peuvent tout simplement pas se produire. C'est exactement quand les affirmations aident beaucoup et gagner du temps

RAPPELEZ assertions peuvent être désactivées à l'exécution en utilisant des paramètres et sont désactivées par défaut , alors ne comptez pas sur eux, sauf à des fins de débogage.

Aussi, vous devriez lire article Oracle à propos de assert pour plus de cas où l'utilisation - ou de ne pas utiliser -. assert

En règle générale:

  • Utiliser des assertions pour des contrôles de cohérence interne où il n'a pas d'importance du tout si quelqu'un les arrête. (Notez que la commande java désactive toutes les assertions par défaut.)
  • Utiliser des tests réguliers pour tout type de contrôle ce qui ne devrait pas être mis hors tension. Cette comprend contrôles défensifs qui protègent contre la cause de dommages potentiels par des insectes et des données de validation / demandes / whatever fournies par les utilisateurs ou les services externes.

Le code suivant de votre question est mauvais style et potentiellement bogué

try {
    group = service().getGroup("abc");
} catch (Exception e) {
    //i dont log error because i know whenever error occur mean group not found
}

Le problème est que vous ne savez pas qu'une exception signifie que le groupe n'a pas été trouvé. Il est également possible que l'appel service() a lancé une exception, ou qu'il est revenu null qui a ensuite provoqué une NullPointerException.

Lorsque vous attrapez une exception « attendue », vous devez attraper que l'exception que vous attendez. En capturant java.lang.Exception (et surtout en ne se connectant), vous faites plus difficile à diagnostiquer / debug le problème, et qui pourrait permettre à l'application pour faire plus de dégâts.

D'après ce document http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , « L'instruction assert convient à condition non publiques, et postcondition invariant classe la vérification. vérification de la condition publique doit être effectuée encore par des contrôles à l'intérieur des méthodes qui résultent notamment, des exceptions documentées, comme IllegalArgumentException et IllegalStateException. "

Si vous voulez en savoir plus sur précondition, postcondition et invariant classe, cochez cette doc: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Il contient également des exemples d'utilisation des assertions.

Eh bien, le dos à Microsoft, la recommandation était de lever des exceptions dans toutes les API vous rendre accessibles au public et à l'utilisation Affirme dans toutes sortes d'hypothèses que vous faites sur le code qui est interne. Il est un peu une définition lâche, mais je suppose que c'est à chaque développeur de tracer la ligne.

En ce qui concerne l'utilisation des exceptions, comme le nom l'indique, leur utilisation doit être exceptionnelle si le code vous présente ci-dessus, l'appel getGroup doit retourner null si aucun service existe. Exception ne doit se produire si un lien de réseau est en panne ou quelque chose comme ça.

Je suppose que la conclusion est qu'il est un peu à gauche vers le bas pour l'équipe de développement pour chaque application pour définir les limites de assert vs exceptions.

Tester NULL ne fonctionnera que pour les valeurs nulles qui causent des problèmes, alors qu'un try / catch comme vous l'avez attrapera any erreur.

De façon générale, try / catch est plus sûr, mais un peu plus lent, et vous devez veiller à ce que vous attrapez tous les types d'erreurs qui peuvent se produire. Je dirais donc utiliser try / catch -. Un jour, le code de getGroup peut changer, et vous pourriez avoir besoin que plus net

Vous pouvez utiliser cette simple différence à l'esprit alors que leur utilisation. Des exceptions seront utilisées pour la vérification des erreurs attendues et des erreurs inattendues appelées enregistrés et non en affirmation est utilisée principalement pour des fins de débogage au moment de l'exécution pour voir si les hypothèses sont validées ou non.

Je vous avoue que je suis un peu confus par votre question. Lorsqu'une condition d'affirmation n'est pas remplie, une exception est levée. Pour compliquer les choses ce qu'on appelle AssertionError . Notez qu'il est décochée, comme (par exemple) IllegalArgumentException qui est jeté dans des circonstances très similaires.

Donc, en utilisant des affirmations en Java

  1. est un moyen plus concis d'écriture d'un bloc état / jet
  2. vous permet de transformer ces contrôles / désactiver via les paramètres JVM. Normalement, je laisserais ces contrôles sur tout le temps, à moins qu'ils n'impact sur les performances d'exécution ou une pénalité similaire.

Voir la section 6.1.2 (Assertions par rapport aux autres code d'erreur) de la documentation de Sun sur le lien suivant.

http://www.oracle.com/technetwork/articles/javase/ javapch06.pdf

Ce document donne le meilleur conseil que je l'ai vu sur le moment d'utiliser les assertions. Je cite le document:

"Une bonne règle de base est que vous devez utiliser une affirmation pour des cas exceptionnels que vous souhaitez oublier. Une assertion est le meilleur moyen de traiter, et d'oublier, une condition ou un état que vous ne vous attendez pas d'avoir à traiter. "

Affirme Malheureusement peut être désactivé. Lorsque la production dont vous avez besoin de toute l'aide que vous pouvez obtenir quand traquer quelque chose d'imprévu, donc se récuser affirme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top