try:
something here
except:
print('the whatever error occurred.')
Comment imprimer l'erreur / l'exception dans mon except:
bloc?
try:
something here
except:
print('the whatever error occurred.')
Comment imprimer l'erreur / l'exception dans mon except:
bloc?
Réponses:
Pour Python 2.6 et versions ultérieures et Python 3.x:
Pour Python 2.5 et versions antérieures, utilisez:
la source
str( KeyError('bad'))
=>'bad'
- ne dit pas le type d'exceptionprint(repr(e))
; l'Exception.__str__
implémentation de base renvoie uniquement le message d'exception, pas le type. Ou, utilisez letraceback
module, qui dispose de méthodes pour imprimer l'exception actuelle, formatée ou la trace complète.Le
traceback
module fournit des méthodes pour formater et imprimer les exceptions et leurs retraits, par exemple, cela afficherait l'exception comme le gestionnaire par défaut:Production:
la source
error_message = traceback.format_exc()
except Exception as ex:
...sys.exc_info()
fonction et latraceback.print_exc()
fonction l'obtient à partir de là. Vous n'auriez besoin que de transmettre une exception de manière explicite lorsque vous ne gérez pas d'exception ou lorsque vous souhaitez afficher des informations basées sur une exception différente.En Python 2.6 ou supérieur, c'est un peu plus propre:
Dans les anciennes versions, il est encore assez lisible:
la source
Si vous souhaitez transmettre des chaînes d'erreur, voici un exemple tiré d' Erreurs et exceptions (Python 2.6)
la source
(J'allais laisser cela comme un commentaire sur la réponse de @ jldupont, mais je n'ai pas assez de réputation.)
J'ai vu des réponses comme la réponse de @ jldupont dans d'autres endroits également. FWIW, je pense qu'il est important de noter que ceci:
affichera la sortie d'erreur
sys.stdout
par défaut. Une approche plus appropriée de la gestion des erreurs en général serait:(Notez que vous devez le faire
import sys
fonctionner.) De cette façon, l'erreur est imprimée sur auSTDERR
lieu deSTDOUT
, ce qui permet une analyse / redirection / etc correcte de la sortie. Je comprends que la question portait strictement sur `` l'impression d'une erreur '', mais il semble important de souligner ici la meilleure pratique plutôt que de laisser de côté ce détail qui pourrait conduire à un code non standard pour quiconque n'apprendrait finalement pas mieux.Je n'ai pas utilisé le
traceback
module comme dans la réponse de Cat Plus Plus, et c'est peut-être la meilleure façon, mais je pensais que je mettrais ça là-bas.la source
Python 3:
logging
Au lieu d'utiliser la
print()
fonction de base , lelogging
module plus flexible peut être utilisé pour enregistrer l'exception. Lelogging
module offre de nombreuses fonctionnalités supplémentaires, par exemple la journalisation des messages dans un fichier journal donné, la journalisation des messages avec des horodatages et des informations supplémentaires sur le lieu de la journalisation. (Pour plus d'informations, consultez la documentation officielle .)La journalisation d'une exception peut être effectuée avec la fonction au niveau du module
logging.exception()
comme ceci:Production:
Remarques:
la fonction
logging.exception()
ne doit être appelée qu'à partir d'un gestionnaire d'exceptionsle
logging
module ne doit pas être utilisé dans un gestionnaire de journalisation pour éviter unRecursionError
(merci @PrakharPandey)Niveaux de journalisation alternatifs
Il est également possible de consigner l'exception avec un autre niveau de journal en utilisant l'argument mot-clé
exc_info=True
comme ceci:la source
Une augmentation d'erreur de ligne peut être effectuée avec des instructions assert si c'est ce que vous voulez faire. Cela vous aidera à écrire du code statiquement réparable et à vérifier les erreurs tôt.
la source
On a à peu près le contrôle sur les informations du traçage à afficher / enregistrer lors de la capture des exceptions.
Le code
produirait le retraçage suivant:
Imprimer / enregistrer la trace complète
Comme d'autres l'ont déjà mentionné, vous pouvez récupérer l'intégralité du traceback en utilisant le module traceback:
Cela produira la sortie suivante:
Vous pouvez obtenir le même résultat en utilisant la journalisation:
Production:
Nom / message d'erreur d'impression / de journalisation uniquement
Vous pourriez ne pas être intéressé par l'intégralité du traçage, mais uniquement par les informations les plus importantes, telles que le nom et le message d'exception, utilisez:
Production:
la source