金字塔全能友好的异常处理

时间:2012-12-19 02:55:11

标签: python exception-handling pyramid

有没有办法可以在Pyramid网络应用中处理某种“全能”错误处理?我目前已经实现了异常日志记录到数据库(通过http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html处的文档),我将向我的观点返回消息,以便对所发生的事情形成“友好”的态度。

但有没有我可以实现的东西会显示某种通用的“哎呀,你遇到了一个问题,我们正在调查它”,其他任何我没有明确捕捉的东西,我可以使用上面的错误在后台处理程序以记录数据库的任何内容?或者,我应该在搜索中寻找什么样的东西?

谢谢,

编辑,因为我无法将其全部纳入评论中: 。 谢谢,这似乎正是我正在寻找的!

我遇到的一件事,我不知道它是否相关......

所以我正如上所述实现SQL logger:

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 个答案:

答案 0 :(得分:11)

您可以设置exception view。例如:

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