Удобная обработка исключений для пирамид

Есть ли способ, с помощью которого я могу обрабатывать некоторую "обработку ошибок" в веб-приложении Pyramid? В настоящее время я выполнил ведение журнала исключений в базе данных (через документы http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html), и я верну сообщения на свои взгляды, чтобы поставить "дружеское" лицо на то, что случилось.

Но есть ли что-то, что я могу реализовать, чтобы показать какой-то общий "Упс, вы столкнулись с проблемой, и мы изучаем его" для чего-либо еще, что я явно не поймаю, и я мог бы использовать указанную выше ошибку обработчик за кулисами для записи в базу данных? Или, что я должен искать в поисках?

Спасибо,

edit, так как я не могу вместить все это в комментарий: , Спасибо, это похоже на то, что я ищу!

Одна вещь, с которой я сталкиваюсь, я не знаю, связано это или нет....

Итак, я реализую SQL-регистратор как показано выше:

class SQLAlchemyHandler(logging.Handler):
    # A very basic logger that commits a LogRecord to the SQL Db
    def emit(self, record):
        trace = None
        exc = record.__dict__['exc_info']
        if exc:
            trace = traceback.format_exc(exc)
        log = Log(
            logger=record.__dict__['name'],
            level=record.__dict__['levelname'],
            trace=trace,
            msg=record.__dict__['msg'],)
        DBSession.add(log)
        DBSession.flush()
        #transaction.commit()

Мне пришлось вытащить вызов transaction.commit() и вместо этого использовать .flush(), потому что при использовании транзакции я получал исключение SQLAlchemy DetachedInstanceError. Я думаю, это потому, что я играю в некоторые игры с передачей запроса на вспомогательную функцию и там, где она, кажется, бросает ее. Таким образом, это работает, очищая сеанс. Buuuut, что произойдет, если у меня есть оператор log.error() в моем представлении исключения, если на самом деле возникает исключение, представление улавливает его (отлично!), Но оператор журнала в представлении не получает значения. Журналы отладки в Pyramid показывают, что они написаны, но никогда не выполнялись.

Если я изменю обработчик ведения журнала обратно на transaction.commit, то исключения будут зафиксированы, но я вернусь к своей исходной проблеме. Я думаю, мне нужно сосредоточиться на том, что я делаю в своей вспомогательной функции, которая вызывает его, в первую очередь, но я все еще изучаю SQLAlchemy в целом. Иногда это может быть немного странно.

Ответ 1

Вы можете настроить представление . Например:

@view_config(context=Exception)
def error_view(exc, request):
    #log or do other stuff to exc...
    return Response("Sorry there was an error")