2012-12-19 60 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