web-dev-qa-db-fra.com

Catch KeyError en Python

Si je lance le code:

connection = manager.connect("I2Cx")

Le programme se bloque et signale une erreur KeyError car I2Cx n'existe pas (il devrait s'agir d'I2C).

Mais si je le fais:

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print e

Il n'imprime rien pour e. J'aimerais pouvoir imprimer l'exception qui a été levée. Si j'essaie la même chose avec une opération de division par zéro, elle est capturée et rapportée correctement dans les deux cas. Qu'est-ce que j'oublie ici?

27
spizzak

S'il soulève une KeyError sans message, il n'imprimera rien. Si tu fais...

try:
    connection = manager.connect("I2Cx")
except Exception as e:
    print repr(e)

... vous obtiendrez au moins le nom de la classe d'exception.

Une meilleure alternative consiste à utiliser plusieurs blocs except et à ne capturer que les exceptions que vous souhaitez gérer ...

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print 'I got a KeyError - reason "%s"' % str(e)
except IndexError as e:
    print 'I got an IndexError - reason "%s"' % str(e)

Il y a des raisons valables de saisir toutes les exceptions, mais vous devriez presque toujours les relancer si vous le faites ...

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print 'I got a KeyError - reason "%s"' % str(e)
except:
    print 'I got another exception, but I should re-raise'
    raise

... parce que vous ne voulez probablement pas gérer KeyboardInterrupt si l'utilisateur appuie sur CTRL-C, ni SystemExit si la try- block appelle sys.exit().

47
Aya

J'utilise Python 3.6 et utiliser une virgule entre Exception et e ne fonctionne pas. Je dois utiliser la syntaxe suivante (juste pour ceux qui se demandent)

try:
    connection = manager.connect("I2Cx")
except KeyError as e:
    print(e.message)
12
ajpieri

Vous devriez consulter la documentation de la bibliothèque qui lève l'exception, pour savoir comment obtenir un message d'erreur avec ses exceptions.

Alternativement, un bon moyen de déboguer ce genre de choses est de dire:

except Exception, e:
    print dir(e)

pour voir quelles propriétés e possède - vous constaterez probablement qu’il possède une propriété message ou similaire.

5
RichieHindle

Vous pouvez également essayer d'utiliser get() , par exemple:

connection = manager.connect.get("I2Cx")

qui ne lèvera pas une KeyError au cas où la clé n'existe pas.

Vous pouvez également utiliser un deuxième argument pour spécifier la valeur par défaut, si la clé n’est pas présente.

2
kenorb

Essayez print (e.message), cela devrait pouvoir imprimer votre exception.

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print(e.message)
0
Mic

Je ne pense pas que python a un piège :)

try:
    connection = manager.connect("I2Cx")
except Exception, e:
    print e
0
Joran Beasley

Si vous ne voulez pas gérer l'erreur, utilisez simplement NoneType et utilisez get()

manager.connect.get("")
0
Amrit