Подтвердить что ты не робот

Как получить имя исключения, которое было обнаружено в Python?

Как я могу получить имя исключения, которое было создано в Python?

например.

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

Например, я улавливаю несколько (или все) исключения и хочу напечатать имя исключения в сообщении об ошибке.

4b9b3361

Ответ 1

Вот два способа получения имени исключения:

  • type(exception).__name__
  • exception.__class__.__name__

например.

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

Ответ 2

Это работает, но кажется, что должен быть более простой, более прямой способ?

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

Ответ 3

Вы также можете использовать sys.exc_info(). exc_info() возвращает 3 значения: тип, значение, трассировка. По документации: 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]" % name_of_exception

Ответ 4

Если вы хотите полностью определенное имя класса (например, sqlalchemy.exc.IntegrityError вместо просто IntegrityError), вы можете использовать приведенную ниже функцию, которую я взял из удивительного ответа MB на другой вопрос (Я просто переименовал некоторые переменные в соответствии со своими вкусами):

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__

Пример:

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

# sqlalchemy.exc.IntegrityError