Как вы вызываете необработанные исключения для вывода через logging
модуль, а не для stderr
?
Я понимаю, что лучший способ сделать это будет:
try:
raise Exception, 'Throwing a boring exception'
except Exception, e:
logging.exception(e)
Но моя ситуация такова, что было бы очень хорошо, если бы logging.exception(...)
они вызывались автоматически всякий раз, когда исключение не было обнаружено.
python
logging
exception-handling
Джейкоб Мрамор
источник
источник
Ответы:
Как указал Нед,
sys.excepthook
он вызывается каждый раз, когда возникает исключение и не выполняется. Практическое следствие этого заключается в том, что в вашем коде вы можете переопределить поведение по умолчанию,sys.excepthook
чтобы делать все, что вы хотите (включая использованиеlogging.exception
).Как пример соломенного человека:
Переопределить
sys.excepthook
:Зафиксируйте очевидную синтаксическую ошибку (не указывайте двоеточие) и получите информацию об ошибке:
Для получения дополнительной информации
sys.excepthook
читайте документы .источник
type
в качестве аргумента функции, хотя IDE будут жаловаться на сокрытие глобальногоtype
(очень похоже на использованиеvar self = this
в Javascript). Это на самом деле не имеет значения, если вам не нужен доступ кtype
объекту внутри вашей функции, и в этом случае вы можете использоватьtype_
вместо этого аргумент.sys.excepthook
НЕ вызывается, когда возникает исключение. Он вызывается, когда программа собирается завершиться из-за необработанного исключения, которое не может произойти более одного раза.Вот полный небольшой пример, который также включает в себя несколько других приемов:
Игнорируйте KeyboardInterrupt, чтобы консольная программа на Python могла завершиться нажатием Ctrl + C.
Полностью полагайтесь на модуль регистрации Python для форматирования исключения.
Используйте собственный регистратор с примером обработчика. Это изменяет необработанное исключение, чтобы перейти к stdout, а не к stderr, но вы можете добавить все виды обработчиков в этом же стиле к объекту регистратора.
источник
logger.critical()
внутри обработчика exchook, так как я бы сказал, что неперехваченное исключение довольно критично.logging.basicConfig(level=logging.DEBUG, filename="debug.log", format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
Но не помогло.Метод
sys.excepthook
будет вызван, если исключение не найдено: http://docs.python.org/library/sys.html#sys.excepthookисточник
type
в инстанс?sys.excepthook
?Почему нет:
Вот результат,
sys.excepthook
как показано выше:Вот вывод с
sys.excepthook
закомментированным:Разница лишь в том, что первый находится
ERROR:root:Unhandled exception:
в начале первой строки.источник
sys.stderr
.Чтобы построить ответ Jacinda, но с использованием объекта logger:
источник
functools.partial()
вместо лямбды. См .: docs.python.org/2/library/functools.html#functools.partialОберните входной вызов приложения в
try...except
блок, чтобы вы могли перехватывать и регистрировать (и, возможно, повторно поднимать) все необработанные исключения. Например, вместо:Сделай это:
источник
Может быть, вы могли бы сделать что-то в верхней части модуля, который перенаправляет stderr в файл, а затем зарегистрировать этот файл в нижней части
источник
Хотя ответ @ gnu_lorien дал мне хорошую отправную точку, моя программа аварийно завершает работу при первом исключении.
Я пришел с настроенным (и / или) улучшенным решением, которое молча регистрирует исключения из функций, которые украшены
@handle_error
.источник
Чтобы ответить на вопрос г-на Зеуса, который обсуждался в разделе комментариев принятого ответа, я использую его для регистрации необработанных исключений в интерактивной консоли (протестировано с PyCharm 2018-2019). Я обнаружил,
sys.excepthook
что не работает в оболочке Python, поэтому я посмотрел глубже и обнаружил, что я мог бы использоватьsys.exc_info
вместо этого. Однакоsys.exc_info
не принимает аргументов, в отличие отsys.excepthook
3 аргументов.Здесь я использую и то,
sys.excepthook
и другое,sys.exc_info
чтобы регистрировать оба исключения в интерактивной консоли и сценарий с функцией оболочки. Чтобы прикрепить функцию ловушки к обеим функциям, у меня есть два разных интерфейса в зависимости от того, заданы аргументы или нет.Вот код:
Настройка регистрации может быть найдена в ответе gnu_lorien.
источник
В моем случае (использование
python 3
) при использовании ответа @Jacinda содержимое трассировки не было напечатано. Вместо этого, он просто печатает сам объект:<traceback object at 0x7f90299b7b90>
.Вместо этого я делаю:
источник