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

Pet*_*ell 11 python exception-handling pyramid

有没有办法在Pyramid Web应用程序中处理某种"全能"错误处理?我目前已经实现了异常日志记录到数据库(通过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()
Run Code Online (Sandbox Code Playgroud)

我不得不取出'transaction.commit()'调用,而是使用.flush(),因为我在使用事务时遇到了SQLAlchemy DetachedInstanceError异常.我认为这是因为我正在玩一些游戏,将请求传递给帮助函数,而这似乎是抛出它的地方.所以它通过刷新会话来工作.Buuuut,如果我在异常视图中有一个log.error()语句会发生什么,如果实际抛出了一个异常,那么视图捕获它(太棒了!)但是视图中的日志语句没有被提交.Pyramid中的调试日志显示它正在写入,但从未提交.

如果我将日志记录处理程序更改回transaction.commit,那么异常被提交,但我回到原来的问题.我想我需要重点关注我在帮助函数中所做的事情,而这正是首先引起它的问题,但我仍然在学习SQLAlchemy.有时它可能有点奇怪.

Bri*_*jes 12

您可以设置例外视图.例如:

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