2012-12-19 96 views
10

有没有一种方法可以处理Pyramid Web应用程序中的某种“全部”错误处理?我目前已经对数据库实施了异常日志记录(通过http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/logging/sqlalchemy_logger.html的文档),我会将消息返回给我的观点,为发生的事情提供一个“友好”的面孔。金字塔所有友好的异常处理

但是有什么我可以实现,会显示某种通用的“糟糕,你遇到了问题,我们正在研究它”为其他任何我没有明确捕获,我可以使用上述错误处理程序在幕后记录什么到数据库?或者,我应该在搜索中寻找什么样的东西?

感谢,

编辑,因为我不能适合所有到注释: 。 谢谢,这似乎正是我要找的!

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

所以我执行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()语句,如果实际抛出异常,视图会捕获它(很棒!),但视图中的日志语句不会被提交。金字塔中的调试日志显示它正在写入,但从未提交。

如果我将日志记录处理程序更改回transaction.commit,那么异常得到承诺,但我回到我原来的问题。我认为我需要重点关注我在帮助函数中做什么,这首先导致了它,但我仍然在学习SQLAlchemy。有时它可能有点奇怪。

回答

10

您可以设置一个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") 
+0

很好!这将处理_any_异常发生_anywhere_视图可调用,正确?我可以在技术上只是再次抛出“exc”而不是返回响应?这种方法今天仍然推荐吗? – Jens