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?
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()
.
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)
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.
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.
Essayez print (e.message), cela devrait pouvoir imprimer votre exception.
try:
connection = manager.connect("I2Cx")
except Exception, e:
print(e.message)
Je ne pense pas que python a un piège :)
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
Si vous ne voulez pas gérer l'erreur, utilisez simplement NoneType
et utilisez get()
manager.connect.get("")