Как использовать пользовательский 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, вы можете просто установить собственное промежуточное программное обеспечение, обернуть его вокруг приложения, зарегистрировать исключение и передать его.

Другие вопросы по тегам