Как получить имя исключения, которое было обнаружено в 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
Например, я улавливаю несколько (или все) исключения и хочу напечатать имя исключения в сообщении об ошибке.
Ответы
Ответ 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