有没有办法可以在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。有时它可能有点奇怪。
答案 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")