有没有一种方法可以处理Pyramid Web应用程序中的某种“包罗万象”错误处理?目前,我已经实现了将异常日志记录到数据库中(通过http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html上的文档),并且我将消息返回到我的 View 中,以对发生的事情“友好”地对待。

但是有什么我可以实现的,可以显示某种通用的“糟糕,您遇到了问题,我们正在研究”,对于其他我没有明确发现的问题,我可以在后面使用上述错误处理程序场景将什么记录到数据库?或者,我应该在搜索中寻找什么样的东西?

谢谢,

编辑,因为我无法将其全部放入注释中:

谢谢,这似乎正是我要的!

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

所以我像上面这样实现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异常。我认为这是因为我正在玩一些游戏,并将请求传递给辅助函数,而这似乎就是在抛出它。因此,它可以通过刷新 session 来工作。 Buuuut,会发生什么情况,如果我的异常 View 中有一个log.error()语句,如果实际上引发了异常,则该 View 会捕获该异常(很好!),但该 View 中的log语句没有被提交。 Pyramid中的调试日志显示它正在被写入,但是从未提交。

如果我将日志处理程序改回transaction.commit,则确实会提交异常,但我又回到了最初的问题。我想我需要重新关注最初导致它的辅助函数中正在执行的操作,但是总体上我仍在学习SQLAlchemy。有时可能有点奇怪。

最佳答案

您可以设置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")

关于python - Pyramid 通用的友好异常处理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13944852/

10-10 13:51
查看更多