it-swarm-fr.com

Quand utiliser des assertions et quand utiliser des exceptions?

Souvent, lorsque j'écris des fonctions, je veux m'assurer que les entrées sont valides afin de détecter de telles erreurs le plus tôt possible (je crois que celles-ci sont appelées conditions préalables). Quand une condition préalable échoue, j'ai toujours jeté une exception. Mais je commence à douter de savoir si ce sont les meilleures pratiques et si pas les affirmations seraient plus appropriées.

Alors, quand devrais-je faire lequel: quand est-il approprié d'utiliser une affirmation et quand est-il approprié de lancer une exception?

45
gablin

Les affirmations ne doivent être utilisées que pour vérifier les conditions qui doivent être logiquement impossibles d'être false (lecture: chèques de santé mentale). Ces conditions ne doivent être basées que sur les intrants générés par votre propre code. Toute vérification basée sur des entrées externes devrait utiliser des exceptions.

Une règle simple que j'ai tendance à suivre est la vérification des arguments des fonctions privées avec des affirmations et utiliser des exceptions pour les arguments des fonctions publiques/protégées.

Les assertions sont utilisées pour trouver des erreurs de programmation. Vos programmes doivent également travailler aussi bien lorsque toutes les assertions sont supprimées.

Des exceptions, d'autre part, sont pour des situations pouvant arriver même lorsque le programme est parfait; Ils sont causés par des influences externes, telles que du matériel, du réseau, des utilisateurs, etc.

34
user281377

La pratique de programmation typique consiste à établir des assertions des constructions de production/de libération. Les affirmations aideront uniquement pendant les tests internes pour accroître l'échec des hypothèses. Vous ne devez pas assumer le comportement des agences externes, vous ne devriez donc pas affirmer sur des événements à partir du réseau ou de l'utilisateur. En outre, c'est une bonne pratique pour écrire un code de manutention pour les constructions de production au cas où une affirmation échoue.

Par exemple en C,

int printf(const char *fmt, ...)
{
  assert(fmt);  // may fail in debug build but not in production build
  if (!fmt) return -1; // handle gracefully in production build
  ...
}

Des exceptions sont censées être intégrées à des constructions de production. L'alternative à une exception est une erreur de retour et non des assertions.

3
aufather

Bien que j'ai posté le Réponse au site Stackoverflow, qui pourrait toujours être utile pour publier ici.

Les affirmations sont utilisées,

  1. Lorsque vous souhaitez arrêter le programme immédiatement plutôt pour procéder à un état indésirable. Ceci est souvent lié à la philosophie du échec-rapide [ 1 ] Conception du système.

  2. Lorsqu'il existe certaines possibilités de défaillance en cascade (c'est-à-dire chez Microservices) pour la première condition inattendue susceptible d'introduire l'application dans des états graves incohérents ou irrécupérables.

  3. Lorsque vous souhaitez détecter des bogues dans votre système exclusivement dans la période de débogage. Vous voudrez peut-être les désactiver dans la production si la langue prend en charge.

  4. Lorsque vous savez déjà que les conditions inattendues sont nées en raison de votre système interne-implémentation et de votre système externe (c'est-à-dire que les appelants) n'ont aucun contrôle sur l'état indésirable.

Des exceptions sont utilisées,

  1. Lorsque vous savez que les conditions inattendues sont posées en raison de la défaillance des systèmes externes (c'est-à-dire des paramètres incorrects, un manque de ressources, etc.).

  2. Lorsque vous savez que les conditions peuvent être sauvegardées avec des trajectoires alternatives à la maintenance des qualités fonctionnelles de l'application encore intactes (c'est-à-dire de bien fonctionner pour un autre appel avec des paramètres appropriés à partir de l'appelant ou du système externe).

  3. Lorsque vous voulez vous connecter et laisser les développeurs savoir sur un état indésirable, mais pas une grosse affaire.

NOTE: "Plus vous utilisez des assertions, le système le plus robuste que vous obtenez". En revanche, "plus vous utilisez des exceptions et de les gérer, le système plus résilient que vous obtenez".


[1] FAIL FAST - Dans la conception de systèmes, un système FAIL-FAST est un système qui rapporte immédiatement à son interface toute condition susceptible d'indiquer une défaillance. Les systèmes Fail-Fast sont généralement conçus pour arrêter le fonctionnement normal plutôt que d'essayer de poursuivre un processus éventuellement imparfait. De telles conceptions vérifient souvent l'état du système à plusieurs moments d'une opération, de sorte que toute défaillance puisse être détectée tôt. La responsabilité d'un module Fail-Fast est de détecter des erreurs, puis laissant le plus haut niveau du système les gérer.

1
Sazzad Hissain Khan

Un problème avec des affirmations pour moi est qu'ils sont désactivés par défaut à Java.

Nous utilisons une stratégie d'échec dans laquelle le programme - qui a peut-être pu être sans surveillance pendant des années - doit être planté le plus tôt possible pour éviter la corruption des données en cas de mauvaises données (sur une forme inattendue). C'est ce que nous utilisons la vérification de la vérification et en utilisant des asserts, nous risquons essentiellement de ne pas être actif.

0
user1249