Catch KeyError en Python
Si j'exécute le code:
connection = manager.connect("I2Cx")
Le programme se bloque et la production de rapports KeyError parce que I2Cx n'existe pas (il doit être I2C).
Mais si je fais:
try:
connection = manager.connect("I2Cx")
except Exception, e:
print e
Il n'a pas l'impression pour l'e. Je voudrais être en mesure d'imprimer de l'exception qui a été levée. Si je tente la même chose avec une division par zéro opération, il est pris et rapporté correctement dans les deux cas. Ce qui me manque ici?
- Remarque: Sauf si vous avez besoin de pré-2.5 compatibilité, vous devez écrire
except Exception as e:
au lieu deexcept Exception, e:
.
Vous devez vous connecter pour publier un commentaire.
Si elle soulève une KeyError avec aucun message, alors il sera impossible d'imprimer quoi que ce soit. Si vous n'...
...vous aurez au moins obtenir le nom de la classe exception.
Une meilleure alternative est d'utiliser plusieurs
except
blocs, et que "attraper" les exceptions que vous avez l'intention de gérer...Il y a des raisons valables pour intercepter toutes les exceptions, mais vous devriez presque toujours-relancer si vous n'avez...
...parce que vous ne voulez probablement pas à gérer
KeyboardInterrupt
si l'utilisateur appuie sur CTRL-C, niSystemExit
si letry
-bloquer les appelssys.exit()
.catch
partie de la véritable impression ... mais oui cela résout ce problème aussicatch
est plus probablement une faute de frappe, depuis l'OP aurait eu une autre erreur qui avait été dans le vrai code.KeyboardInterrupt
etSystemExit
ne sont pas des sous-classes deException
, de sorte que votre dernière phrase est trompeuse.except Exception, e:
, àexcept:
. On dirait que vous avez à consultersys.exc_info()
pour obtenir de l'exception dans un nu -except:
clause, donc c'est probablement plus simple de le supprimer.KeyboardInterrupt
etSystemExit
, attraperBaseException
plutôt queException
. Ce ne parvenez toujours pas à gérer nu-chaîne des exceptions (ou exceptions de sans rapport avec les types que vous avez en quelque sorte réussi à amasser derrière l'interprète de back—assez facile de faire accidentellement dans un C module d'extension, pas facile à faire, même sur le but en pur Python); pour cela, vous avez besoin d'un nuexcept
.BaseException
, mais j'ai décidé que ne s'est toujours pas techniquement attraper toutes les exceptions. Ressemble (au moins en Python 2.7.3) on ne peut pas augmenter à nu les chaînes de plus, mais par les regards de la message d'erreurTypeError: exceptions must be old-style classes or derived from BaseException, not str
vous pouvez toujours augmenter le vieux-classes de style.Exception
puis reraising pour éviter d'avaler deKeyboardInterrupt
etSystemExit
. Ce n'est pas nécessaire; si vous attrapezException
vous n'en tiendront pas compte de ceux-ci. C'est tout. C'est très bien comme il est maintenant.except
clause 2.7.3, mais seulement parce que je n'étais pas au courant de la nouvelle syntaxe. Encore, il n'est pas déraisonnable de supposer que la plupart des gens à l'aide de 2.x sera à l'aide de 2.6.x ou 2.7.x.except
clause, bien, non sans attraper une super-classe de ces types, et je ne peux pas vraiment voir de nombreux cas où il serait particulièrement utile de le faire. Un gestionnaire d'exception est généralement va être spécifique à une classe d'exception, ou suffisamment général pour justecatch Exception
. Il vous arrive de savoir si lecatch Type1, Type2
idiome est utilisé n'importe où dans la bibliothèque standard?ValueError
, mais 0.89 soulève unTypeError
ou unfoo.FooError
. (Les solutions sont les deux copier-colléexcept
blocs, ou unexcept Exception as e:
avecif isinstance(e, (ValueError, TypeError)): raise
, ou nécessitant foo-0,89 ou plus tard, pour aucune bonne raison...)Je suis à l'aide de Python 3.6 et à l'aide d'une virgule entre Exception et e ne fonctionne pas. J'ai besoin d'utiliser la syntaxe suivante (juste pour vous demandez-vous à quelqu'un)
Vous devriez consulter la documentation de ce que la bibliothèque est en train de jeter l'exception, pour voir comment obtenez un message d'erreur de ses exceptions.
Sinon, un bon moyen de déboguer ce genre de chose est-à-dire:
pour voir quelles sont les propriétés
e
est - ce que vous aurez probablement trouver qu'il a unmessage
propriété ou similaire.Vous pouvez également essayer d'utiliser
get()
, par exemple:qui ne pas élever un
KeyError
dans le cas où la clé n'existe pas.Vous pouvez également utiliser le deuxième argument pour spécifier la valeur par défaut si la clé n'est pas présente.
Je ne pense pas que python a un hic 🙂
Si vous ne voulez pas gérer l'erreur juste
NoneType
et l'utilisationget()
par exemple:
Essayer d'impression(e.message), vous devez être en mesure d'imprimer vos exception.