Я пытаюсь разработать программу на Python, которая регистрирует все необработанные исключения с помощью модуля ведения журнала. Я делаю это с помощью функции sys.excepthook, чтобы переопределить обработку исключений по умолчанию. Я заметил, что если я запускаю программу прямо из командной строки, она работает нормально, но если я пытаюсь импортировать файл, он не работает. Кажется, что функция sys.excepthook не знает о модуле регистрации. Вот пример:
#! /usr/bin/env python2.7
import logging, sys
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.FileHandler("test.log"))
print "outside of exception handler: logger = %s" % logger
def handleException(excType, excValue, traceback):
#global logger # this function doesn't work whether or not I include this line
print "inside exception handler: logger = %s" % logger
logger.error("Uncaught exception", exc_info=(excType, excValue, traceback))
sys.excepthook = handleException
logger.debug("starting")
asdf # create an exception
Если я запускаю это из командной строки (./loggingTest.py
), все работает нормально. Записывается исключение, и я вижу этот вывод:
outside of exception handler: logger = <logging.RootLogger object at 0x7f2022eab950>
inside exception handler: logger = <logging.RootLogger object at 0x7f2022eab950>
Однако, если я запускаю интерпретатор Python и пытаюсь импортировать файл (import loggingTest
), он действует странно. Исключение не регистрируется, и я вижу это:
outside of exception handler: logger = <logging.RootLogger object at 0x7f8ab04f3ad0>
inside exception handler: logger = None
Error in sys.excepthook:
Traceback (most recent call last):
File "loggingTest.py", line 13, in handleException
logger.error("Uncaught exception", exc_info=(excType, excValue, traceback))
AttributeError: 'NoneType' object has no attribute 'error'
Original exception was:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "loggingTest.py", line 18, in <module>
asdf # create an exception
NameError: name 'asdf' is not defined
Может быть, я могу обойти эту проблему, снова импортировав модуль регистрации в sys.excepthook, но мне все еще интересно: почему это происходит?