web-dev-qa-db-fra.com

Comment imprimer une exception en Python?

try:
    something here
except:
    print 'the whatever error occurred.'

Comment puis-je imprimer l'erreur/exception dans mon bloc except:?

549
TIMEX

Pour Python 2.6 et versions ultérieures et Python 3.x:

except Exception as e: print(e)

Pour Python 2.5 et versions antérieures, utilisez:

except Exception,e: print str(e)
819
jldupont

Le module traceback fournit des méthodes pour formater et imprimer des exceptions et leurs tracés, par exemple. ceci afficherait une exception comme le fait le gestionnaire par défaut:

import traceback

try:
    1/0
except Exception:
    traceback.print_exc()

Sortie:

Traceback (most recent call last):
  File "C:\scripts\divide_by_zero.py", line 4, in <module>
    1/0
ZeroDivisionError: division by zero
357
Cat Plus Plus

Dans Python 2.6 ou supérieur c'est un peu plus propre:

except Exception as e: print(e)

Dans les anciennes versions, cela reste lisible:

except Exception, e: print e
163
ilya n.

Si vous voulez passer des chaînes d’erreur, voici un exemple de Errors and Exceptions (Python 2.6)

>>> try:
...    raise Exception('spam', 'eggs')
... except Exception as inst:
...    print type(inst)     # the exception instance
...    print inst.args      # arguments stored in .args
...    print inst           # __str__ allows args to printed directly
...    x, y = inst          # __getitem__ allows args to be unpacked directly
...    print 'x =', x
...    print 'y =', y
...
<type 'exceptions.Exception'>
('spam', 'eggs')
('spam', 'eggs')
x = spam
y = eggs
49
Nick Dandoulakis

(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 celle de @ jldupont ailleurs. FWIW, je pense qu'il est important de noter que ceci:

except Exception as e:
    print(e)

imprimera la sortie d'erreur sur sys.stdout par défaut. Une approche plus appropriée du traitement des erreurs en général serait la suivante:

except Exception as e:
    print(e, file=sys.stderr)

(Notez que vous devez import sys pour que cela fonctionne.) De cette façon, l'erreur est imprimée sur STDERR au lieu de STDOUT, ce qui permet d'analyser correctement la sortie, de la rediriger, etc. Je comprends que la question portait strictement sur "l'impression d'une erreur", mais il semble important de souligner la meilleure pratique ici plutôt que de laisser de côté ce détail qui pourrait conduire à un code non standard pour ceux qui n'apprendraient finalement pas mieux.

Je n'ai pas utilisé le module traceback comme dans la réponse de Cat Plus Plus, et c'est peut-être la meilleure solution, mais je pensais que je l'aurais mis là-dessus.

32
grish

Une erreur de relèvement peut être générée avec des déclarations d'assertion si c'est ce que vous voulez faire. Cela vous aidera à écrire du code statiquement réparable et à vérifier les erreurs plus tôt.

assert type(A) is type(""), "requires a string"
5
whatnick

Si vous souhaitez imprimer le message sur stderr, quittez avec un code d'état de 1 (erreur):

import sys

try:
    ...
except Exception as e:
    sys.exit("Message to print to stderr")
0
Roger Dahl