132 votes

Lors de l'utilisation d'une assertion et quand utiliser une exception

La plupart du temps, je vais utiliser une exception pour vérifier une condition dans mon code, je me demande quand c'est un moment approprié pour utiliser une affirmation?

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 s'inscrit dans ici? Devrais-je utiliser une affirmation?

Il semble que je n'ai jamais utiliser les assertions contenues dans le code de production et ne vois que des assertions dans les tests unitaires. Je sais que dans la plupart des cas, je peux juste utiliser de l'exception d'effectuer la vérification, comme ci-dessus, mais je veux connaître la façon appropriée de faire de "professionnalisme".

185voto

Gregory Pakosz Points 35546

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

  • l'utilisation des exceptions lors de la vérification des paramètres passés au public ou protégé des méthodes et des constructeurs
  • utiliser les exceptions lors de l'interaction avec l'utilisateur ou lorsque vous vous y attendez le code client de récupérer à partir d'une situation exceptionnelle
  • utiliser les exceptions pour résoudre les problèmes qui pourraient survenir
  • utilisez les assertions lors de la vérification des pré-conditions, post-conditions et invariants du privé/code interne
  • utilisez les assertions de fournir de la rétroaction à vous-même ou votre équipe de développeur
  • utilisez les assertions lors de la vérification de choses qui sont très peu probable que cela arrive autrement, cela signifie qu'il ya un grave défaut dans votre application
  • utiliser les affirmations de l'état des choses que vous (soi-disant) savez être vrai.

En d'autres termes, les exceptions concernent la robustesse de votre application tout en les assertions de l'adresse de son exactitude.

Les Assertions sont conçus pour être facile à écrire, vous pouvez utiliser presque partout et je suis en utilisant cette règle de base: plus une assertion semble stupide, d'autant plus précieux qu'il est et le plus d'informations qu'elle incorpore. Lors du débogage d'un programme qui ne se comportent pas de la bonne façon, vous aurez sûrement vérifier les plus évidentes de l'échec de possibilités en fonction de votre expérience. Alors vous allez vérifier pour des problèmes qui ne peuvent tout simplement pas se produire: c'est exactement là que des affirmations aide beaucoup et gagner du temps.

89voto

Marius Points 27452

Les Assertions doit être utilisé pour vérifier quelque chose qui ne devrait jamais se produire, tandis qu'une exception doit être utilisé pour vérifier quelque chose qui pourrait se produire. Par exemple, une fonction peut diviser par 0, donc une exception devrait être utilisé, mais une affirmation pourrait être utilisé pour vérifier que le disque dur disparait soudainement. Une affirmation pourrait arrêter le programme en cours d'exécution, mais une exception serait laisser le programme de continuer à fonctionner.

Notez que if(group != null) n'est pas une affirmation, c'est juste un conditionnel.

30voto

chburd Points 2902

Souvenez-vous des affirmations peut être désactivé au moment de l'exécution à l'aide de paramètres, et sont désactivés par défaut, donc ne comptez pas sur eux, sauf pour des fins de débogage.

En outre, vous devriez lire l' Oracle de l'article à propos de faire valoir pour voir plus de cas d'utiliser ou de ne pas utiliser - valoir.

17voto

Stephen C Points 255558

Le code suivant est mauvais style, et potentiellement buggy

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' service() appel a déclenché une exception, ou qu'il est rentré null qui a ensuite provoqué une NullPointerException.

Lorsque vous attrapez un "attendu" d'exception, vous devez attraper seulement à l'exception que vous attendez. En attrapant java.lang.Exception (et en particulier par la fermeture de session), vous rendant la tâche plus difficile à diagnostiquer / déboguer le problème, et, potentiellement, permettant à l'application de faire plus de dégâts.

4voto

rui Points 4282

Bien, retour à Microsoft, la recommandation était de lever des Exceptions à toutes les Api vous rendre à la disposition du public et de l'utilisation Affirme dans toutes sortes d'hypothèses que vous avez faites sur le code interne. C'est un peu une définition générale, mais je suppose que c'est à chacun de dev pour définir la ligne.

Concernant l'utilisation des Exceptions, comme son nom l'indique, leur utilisation devrait être exceptionnel donc pour le code présent ci-dessus, le getGroup appel shoukd retour null si aucun service n'existe. Exception se produit uniquement si une connexion 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 à l'équipe de dev pour chaque application afin de définir les limites d'affirmer vs exceptions.

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