#python #exception #logging
Вопрос:
Используя что-то вроде этого:
try:
# Something...
except Exception as excep:
logger = logging.getLogger("component")
logger.warning("something raised an exception: " excep)
logger.info("something raised an exception: " excep)
Я бы предпочел, чтобы это не было на уровне ошибок, потому что в моем конкретном случае это не ошибка.
Ответ №1:
Из документации по ведению журнала:
Существует три ключевых аргумента, в
kwargs
которых проверяются:exc_info
,stack_info
, иextra
.Если
exc_info
значение не оценивается как ложное, это приводит к добавлению информации об исключении в сообщение журнала. Если предоставлен кортеж исключений (в формате, возвращаемомsys.exc_info()
) или экземпляр исключения, он используется; в противном случаеsys.exc_info()
вызывается для получения информации об исключении.
Так что:
logger.warning("something raised an exception:", exc_info=True)
Комментарии:
1. Обратите внимание, что в документах это явно не упоминается для получения информации, предупреждения, ошибки и т.д. Они просто говорят: «Аргументы интерпретируются как для debug ()». Вот почему, если вам нужно вернуться к этому позже, вот где вам следует искать приведенное выше описание этого поведения.
Ответ №2:
Вот один из них, который работает (python 2.6.5).
logger.critical("caught exception, traceback =", exc_info=True)
Ответ №3:
Вы можете попробовать это:
from logging import getLogger
logger = getLogger('warning')
try:
# Somethings that is wrong.
except Exception as exp:
logger.warning("something raised an exception: " , exc_info=True)
logger.warning("something raised an exception: {}".format(exp)) # another way
Комментарии:
1. IIRC, они не будут делать то же самое. Первый способ регистрирует трассировку стека, второй способ регистрирует имя класса исключения для возникшего исключения. Это совсем другое дело.
2. @BrianPeterson Цель qeustion — распечатать
exp
. оба упомянутых метода регистратора выполняют это. Я проверил это сейчас.