La plupart du temps, j'utiliserai une exception pour vérifier une condition dans mon code, je me demande quand est-il opportun d'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
}
Pouvez-vous indiquer comment une assertion s'inscrit ici? Dois-je utiliser une assertion?
Il semble que je n'utilise jamais d'assertions dans le code de production et que je ne vois que les assertions dans les tests unitaires. Je sais que dans la plupart des cas, je peux simplement utiliser l'exception pour faire la vérification comme ci-dessus, mais je veux savoir comment le faire "professionnellement".
Hors de ma tête (la liste peut être incomplète et trop longue pour tenir dans un commentaire), je dirais:
En d'autres termes, les exceptions concernent la robustesse de votre application tandis que les assertions traitent de son exactitude.
Les assertions sont conçues pour être bon marché à écrire, vous pouvez les utiliser presque partout et j'utilise cette règle de base: plus une déclaration d'assertion semble stupide, plus elle est précieuse et plus elle intègre d'informations. Lors du débogage d'un programme qui ne se comporte pas correctement, vous vérifierez sûrement les possibilités d'échec les plus évidentes en fonction de votre expérience. Ensuite, vous vérifierez les problèmes qui ne peuvent tout simplement pas arriver: c'est exactement à ce moment que les affirmations aident beaucoup et font gagner du temps.
la source
N'oubliez pas que les assertions peuvent être désactivées lors de l'exécution à l'aide de paramètres et sont désactivées par défaut , alors ne comptez pas sur elles sauf à des fins de débogage.
Vous devriez également lire l' article d'Oracle sur assert pour voir plus de cas où utiliser - ou ne pas utiliser - assert.
la source
En règle générale:
java
commande désactive toutes les assertions par défaut.)Le code suivant de votre question est de mauvais style et potentiellement bogué
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'
service()
appel ait levé une exception, ou qu'il ait renvoyénull
ce qui a ensuite provoqué unNullPointerException
.Lorsque vous détectez une exception «attendue», vous ne devez intercepter que l'exception que vous attendez. En attrapant
java.lang.Exception
(et surtout en ne le journalisant pas), vous rendez plus difficile le diagnostic / débogage du problème, et potentiellement en permettant à l'application de faire plus de dégâts.la source
Eh bien, chez Microsoft, la recommandation était de lancer des exceptions dans toutes les API que vous mettez à disposition du public et d'utiliser des Asserts dans toutes sortes d'hypothèses que vous faites sur le code interne. C'est un peu une définition vague, mais je suppose que c'est à chaque développeur de tracer la ligne.
En ce qui concerne l'utilisation des exceptions, comme son nom l'indique, leur utilisation doit être exceptionnelle, donc pour le code que vous présentez ci-dessus, l'
getGroup
appel doit revenirnull
si aucun service n'existe. Une exception ne devrait se produire que si une liaison réseau tombe en panne ou quelque chose du genre.Je suppose que la conclusion est qu'il appartient un peu à l'équipe de développement de chaque application de définir les limites entre assert et exceptions.
la source
Selon ce document http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#design-faq-general , "L'instruction assert est appropriée pour les précondition, postcondition et invariant de classe non publiques La vérification des conditions préalables publiques doit toujours être effectuée par des vérifications à l'intérieur des méthodes qui entraînent des exceptions documentées particulières, telles que IllegalArgumentException et IllegalStateException. "
Si vous voulez en savoir plus sur la précondition, la postcondition et l'invariant de classe, consultez ce document: http://docs.oracle.com/javase/6/docs/technotes/guides/language/assert.html#usage-conditions . Il contient également des exemples d'utilisation des assertions.
la source
Le test de null n'attrapera que les nulls causant des problèmes, alors qu'un try / catch tel que vous l'avez détectera toute erreur.
En gros, try / catch est plus sûr, mais légèrement plus lent, et vous devez faire attention à ce que vous détectiez tous les types d'erreurs qui peuvent survenir. Donc, je dirais d'utiliser try / catch - un jour, le code getGroup peut changer, et vous pourriez avoir besoin de ce plus grand réseau.
la source
Vous pouvez utiliser cette simple différence à l'esprit lors de leur utilisation. Les exceptions seront utilisées pour vérifier les erreurs attendues et inattendues appelées erreur vérifiée et non vérifiée tandis que l'assertion est principalement utilisée à des fins de débogage au moment de l'exécution pour voir si les hypothèses sont validées ou non.
la source
J'avoue que je suis un peu confus par votre question. Lorsqu'une condition d'assertion n'est pas remplie, une exception est levée. Confusément, cela s'appelle AssertionError . Notez qu'elle n'est pas cochée, comme (par exemple) IllegalArgumentException qui est lancée dans des circonstances très similaires.
Donc, en utilisant des assertions en Java
la source
Voir la section 6.1.2 (Assertions vs autre code d'erreur) de la documentation de Sun au lien suivant.
http://www.oracle.com/technetwork/articles/javase/javapch06.pdf
Ce document donne les meilleurs conseils que j'ai vus sur le moment d'utiliser les assertions. Citant le document:
"En règle générale, vous devez utiliser une assertion pour les cas exceptionnels que vous aimeriez oublier. Une assertion est le moyen le plus rapide de traiter et d'oublier une condition ou un état que vous ne pensez pas devoir traiter avec."
la source
Malheureusement, les assertions peuvent être désactivées. Lorsque vous êtes en production, vous avez besoin de toute l'aide que vous pouvez obtenir pour repérer quelque chose d'imprévu, alors les affirmations se disqualifient.
la source