192 votes

Comment obtenir le nom d'une exception qui a été attrapée en Python ?

Comment puis-je obtenir le nom d'une exception levée en Python ?

Par exemple,

try:
    foo = bar
except Exception as exception:
    name_of_exception = ???
    assert name_of_exception == 'NameError'
    print "Failed with exception [%s]" % name_of_exception

Par exemple, j'attrape plusieurs (ou toutes) exceptions, et je veux imprimer le nom de l'exception dans un message d'erreur.

316voto

Tim Points 1338

Voici quelques façons différentes d'obtenir le nom de la classe de l'exception :

  1. type(exception).__name__
  2. exception.__class__.__name__
  3. exception.__class__.__qualname__

Par exemple,

try:
    foo = bar
except Exception as exception:
    assert type(exception).__name__ == 'NameError'
    assert exception.__class__.__name__ == 'NameError'
    assert exception.__class__.__qualname__ == 'NameError'

13voto

MarredCheese Points 2206

Si vous voulez le nom de classe entièrement qualifié (par exemple sqlalchemy.exc.IntegrityError au lieu de simplement IntegrityError ), vous pouvez utiliser la fonction ci-dessous, que j'ai prise de La réponse géniale de MB à une autre question (j'ai juste renommé certaines variables à mon goût) :

def get_full_class_name(obj):
    module = obj.__class__.__module__
    if module is None or module == str.__class__.__module__:
        return obj.__class__.__name__
    return module + '.' + obj.__class__.__name__

Exemple :

try:
    # <do something with sqlalchemy that angers the database>
except sqlalchemy.exc.SQLAlchemyError as e:
    print(get_full_class_name(e))

# sqlalchemy.exc.IntegrityError

9voto

sparrow Points 353

Vous pouvez également utiliser sys.exc_info() . exc_info() retourne 3 valeurs : type, valeur, traceback. Sur la documentation : https://docs.python.org/3/library/sys.html#sys.exc_info

import sys

try:
    foo = bar
except Exception:
    exc_type, value, traceback = sys.exc_info()
    assert exc_type.__name__ == 'NameError'
    print "Failed with exception [%s]" % exc_type.__name__

7voto

GIANCARLO PRADO Points 71

Vous pouvez imprimer l'exception en utilisant des chaînes de caractères formatées :

Exemple :

try:
    #Code to execute
except Exception as err:
    print(f"{type(err).__name__} was raised: {err}")

6voto

Rob Bednark Points 1663

Cela fonctionne, mais il semble qu'il doit y avoir un moyen plus facile, plus direct ?

try:
    foo = bar
except Exception as exception:
    assert repr(exception) == '''NameError("name 'bar' is not defined",)'''
    name = repr(exception).split('(')[0]
    assert name == 'NameError'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X