Как использовать пользовательский sys.excepthook в RootController в TurboGears 2.2.2
Я хочу, чтобы в моем приложении TB регистрировались все исключения в файле журнала. Итак, я попытался использовать пользовательский sys.excepthook как обычно. Но каждое исключение все еще возникает и ничего не регистрируется. Вот мой код:
class RootController(BaseController):
secc = SecureController()
error = ErrorController()
def __init__(self):
self.installExceptHook()
super(RootController, self).__init__()
def installExceptHook(self):
def exceptHook(type, value, tb):
logger = logging.getLogger('app')
logger.critical(''.join(traceback.format_exception(type, value, tb)))
sys.excepthook = exceptHook
Когда я поднимаю ValueError в методе index:
@expose('app.templates.index')
def index(self, **kwargs):
raise ValueError
return dict(page = 'index')
Я все еще получаю страницу отслеживания WebError в моем браузере, и ничего не регистрируется.
Вы знаете, что я делаю не так? Любая идея?
1 ответ
Из документов ( http://docs.python.org/2/library/sys.html):
Когда исключение возникает и не обрабатывается, интерпретатор вызывает sys.excepthook [...] в программе на Python, это происходит непосредственно перед выходом из программы.
Теперь, поскольку WebError перехватывает исключение и обрабатывает его (ваше приложение даже не выходит из таких исключений), исключение не достигает точки, когда sys.excepthook
вызывается.
Для быстрого и грязного решения, вы можете попробовать установить full_stack = False
в вашей конфигурации для отключения промежуточного программного обеспечения WebError ( https://github.com/TurboGears/tg2/blob/tg2.2.2/tg/configuration/app_config.py) это, конечно, будет означать, что вы обрабатываете коды ответов об ошибках в своем веб сервер.
Если вы просто хотите зарегистрировать исключение, но по-прежнему используете функцию отладки / электронной почты WebError, вы можете просто установить собственное промежуточное программное обеспечение, обернуть его вокруг приложения, зарегистрировать исключение и передать его.