web-dev-qa-db-fra.com

Python: différence entre ValueError et Exception?

J'essaie de comprendre quelle est la différence entre une valeur ValueError et une exception. J'ai essayé les deux dans le même code (même dans la même branche) et le résultat était le même - j'ai reçu un message d'erreur.

J'ai fait une recherche sur cette question sur SO, mais je n'ai trouvé aucune discussion à ce sujet. Ensuite, j'ai lu la documentation sur les exceptions et trouvé le definition de ValueError suivant: 

Lancé lorsqu'une opération ou une fonction intégrée reçoit un argument ayant le type correct, mais une valeur inappropriée, et la situation n'est pas décrite par une exception plus précise, telle que IndexError.

Donc, si je comprends bien, une exception est un terme plus général, et ValueError peut être appliqué dans certains cas spécifiques. Mais comme les résultats de ces deux choses sont identiques, je souhaite comprendre quelle est la signification pratique de la différenciation entre ValueError et Exception. La version Python devrait être ici non pertinente. Je vous remercie!

EDIT: Merci à vos réponses, quelle est la différence entre les deux termes dans la construction try-exception. Mais en quoi diffèrent-ils dans le cas où ils sont simplement élevés, sans exception?

raise Exception('blah') 

et 

raise ValueError('blah') 

Répondant à @PeterWood: dans les deux cas, je viens de recevoir le message d'erreur "blah", mais dans un cas c'était "Exception: blah", et dans le second: "ValueError: blah". Et je ne vois dans ce cas aucune différence pratique entre les deux.

6
vlad.rad

ValueError hérite de Exception. Vous pouvez décider de ne capturer que ValueError, ou Exception, c'est à cela que sert l'héritage d'exception.

Dans cet exemple:

try:
    a=12+"xxx"
except Exception:
    # exception is trapped (TypeError)

exception est capturée, toutes les exceptions (à l'exception des exceptions BaseException) sont capturées par l'instruction except.

Dans cet autre exemple:

try:
    a=12+"xxx"
except ValueError:
    # not trapped

Ici, l'exception n'est PAS piégée (TypeError n'est pas ValueError et n'hérite pas)

Vous utilisez généralement des exceptions spécifiques pour intercepter uniquement celles qui sont susceptibles de se produire (le meilleur exemple est IOError lors de la gestion de fichiers) et laissez le reste non piégé. Le danger d'attraper toutes les exceptions est d'obtenir un morceau de code qui ne plante pas, mais ne fait rien.

(éditez la réponse en réponse à votre modification :) lorsque vous générez une exception: vous créez une instance de Exception qui sera filtrée par les futures instructions except ValueError:. le message est différent car la représentation de l'exception (lorsqu'elle est imprimée) inclut le nom de la classe de l'exception.

10

Vous l'avez dit, ValueError est une exception spécifique. Un petit exemple:

try:
    print int("hello world")
except ValueError:
    print "A short description for ValueError"

Si vous changez "hello world" avec un int, print int (42), l'exception ne sera pas levée.

Vous pouvez voir doc sur les exceptions ici .

1
Nicolas Flores