101 votes

Python : Capture d'exception spécifique

Je veux attraper une ValueError spécifique, pas n'importe quelle ValueError.
J'ai essayé quelque chose comme ceci :

try: maquina['WPF'] = macdat(ibus, id, 'WPF')
except: ValueError, 'Pour STRING = ’WPF’, cette machine n'est pas une machine à vent.':
    pass

Mais cela provoque une Erreur de syntaxe : impossible d'assigner à un littéral.
Ensuite, j'ai essayé :

try: maquina['WPF'] = macdat(ibus, id, 'WPF')
except ValueError, e:
    if e != 'Pour STRING = ’WPF’, cette machine n'est pas une machine à vent.':
        raise ValueError, e

Mais cela provoque l'exception, même si c'est celle que je veux éviter.

127voto

mgilson Points 92954

Dans except ValueError,e, e est une instance de l'exception, pas une chaîne de caractères. Donc lorsque vous testez si e n'est pas égal à une chaîne de caractères particulière, ce test est toujours Faux. Essayez :

if str(e) != "..."

au lieu de cela.

Exemple :

def catch(msg):
    try:
        raise ValueError(msg)
    except ValueError as e:  # syntaxe as e ajoutée vers python2.5
        if str(e) != "foo":
            raise
        else:
            print("attrapé!")

catch("foo")
catch("bar")

Typiquement, vous ne voulez pas vraiment compter sur le message d'erreur si vous pouvez l'éviter -- C'est un peu trop fragile. Si vous avez le contrôle sur l'appelable macdat, au lieu de lever une ValueError dans macdat, vous pourriez lever une exception personnalisée qui hérite de ValueError:

class MyValueError(ValueError): pass

Ensuite, vous ne pouvez attraper que MyValueError et laisser les autres ValueError continuer leur chemin pour être attrapés par quelque chose d'autre (ou pas). Un simple except ValueError continuera de capturer ce type d'exception également, donc cela devrait se comporter de la même manière dans d'autres parties du code qui pourraient également attraper des ValueErrors de cette fonction.

5voto

Bas Wijnen Points 904

La méthode pour le dernier est correcte (mais affiche repr(e) pour voir pourquoi cela ne fonctionne pas).

Cependant, si vous voulez que les informations sur l'exception soient correctes, vous ne devriez pas lever une nouvelle exception (comme vous le faites actuellement), mais lever la même. Sinon, plus de code le rattrapant, ou le message d'erreur s'il n'est pas attrapé, montrera votre code comme la source, alors que cela devrait être la source originale.

Pour ce faire, utilisez raise sans argument (dans le bloc except, bien sûr, sinon il n'y a pas d'exception "actuelle").

4voto

Siddharth Mishra Points 106

Vous pouvez utiliser: type(e) et e.args pour cela. Cela renvoie un tuple, faites correspondre le tuple avec le vôtre.

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