web-dev-qa-db-fra.com

Exception vs assertion?

Duplicata possible:
conception par contrat tests par assertion ou par exception?

Existe-t-il une règle générale à suivre pour décider d'utiliser des exceptions plutôt que des assertions (ou vice versa)? En ce moment, je ne lance que si quelque chose que je pense se produira pendant l'exécution du côté utilisateur (comme une erreur de socket ou de fichier). Presque tout le reste que j'utilise affirme.

De plus, si je devais lancer une assertion, qu'est-ce qu'un objet standard Nice à lancer? IIRC il y a std :: logic_error mais ce n'est pas un bon objet à lancer? que jetterais-je pour un fichier manquant ou une entrée inattendue (comme à partir de la ligne de commande au lieu d'une application frontale)?

45
user34537

Ma règle d'or:

Des exceptions sont utilisées pour les conditions d'erreur d'exécution (erreurs d'E/S, mémoire insuffisante, impossible d'obtenir une connexion à la base de données, etc.).

Les assertions sont utilisées pour les erreurs de codage (cette méthode n'accepte pas les valeurs nulles et le développeur les a quand même transmises).

Pour les bibliothèques avec des classes publiques, lève des exceptions sur les méthodes publiques (car il est logique de le faire). Les assertions sont utilisées pour détecter VOS erreurs, pas les leurs.

EDIT: Cela peut ne pas être entièrement clair, en raison de l'exemple de valeur nulle. Mon point est que vous utilisez des assertions (comme d'autres l'ont souligné) pour des conditions qui ne devraient JAMAIS se produire, pour des conditions qui ne devraient JAMAIS en faire du code de production. Ces conditions doivent absolument échouer pendant les tests unitaires ou les tests d'assurance qualité.

39
Mike Hofer

Affirmez que ce que vous savez ne peut pas se produire (c'est-à-dire que si cela se produit, c'est votre faute d'être incompétent).

Déclenchez des situations exceptionnelles qui ne sont pas traitées par le flux de contrôle régulier du programme.

18
Afd

J'utilise des asserts pour des choses qui ne devrait jamais arriver, pourtant. Le genre de chose que lorsque cela se produit, le développeur doit revoir les hypothèses incorrectes.

J'utilise des exceptions pour tout le reste.

Dans le code réutilisable, je préfère une exception car elle donne à l'appelant le choix de gérer ou non le problème. Essayez d'attraper et de gérer une assertion!

2
Paul Beckingham

Vous utilisez des exceptions pour des situations exceptionnelles . Par exemple une situation de mémoire insuffisante ou une panne de réseau.

Vous utilisez assert pour vérifier qu'une précondition de cetain est remplie. Par exemple, un pointeur n'est pas NULL ou un entier est dans une certaine plage.

2
Toon Krijthe

Assert est un moyen de vérifier que le programme est dans un état possible. Si une fonction renvoie -1 alors qu'elle ne doit renvoyer que des entiers positifs et que vous avez une assertion qui le vérifie, votre programme doit s'arrêter car il place votre programme dans un état dangereux.

2
Loki

En règle générale, je lève des exceptions de:

  1. fonctions publiques d'un package pour détecter les erreurs de programmation.
  2. fonctions internes pour signaler les erreurs système ou les erreurs de sous-système de transmission.

où j'utilise les assertions uniquement en interne pour détecter les erreurs de mise en œuvre.

1
donpark