使用一個函數處理全部 HTTP 錯誤

在 Flask 程序中,使用 app.errorhandler() 裝飾器能夠註冊錯誤處理函數,傳入 HTTP 錯誤狀態碼或是特定的異常類,好比:app

@app.errorhandler(404)
def error_404(e):
    return '404 Error', 404複製代碼

若是發生 404 錯誤,就會觸發這個函數獲取返回值做爲響應主體。函數

一般咱們會爲不一樣的 HTTP 錯誤編寫各自的的錯誤處理函數,以便返回不一樣的響應。若是你願意的話,咱們也能夠編寫一個統一的錯誤處理函數,這個函數會處理全部的 HTTP 錯誤,只須要在裝飾器內傳入 Exception 類便可:spa

@app.errorhandler(Exception)
def all_exception_handler(e):
    return 'Error', 500複製代碼

如今全部的 HTTP 錯誤都會觸發這個函數。你也能夠在函數中對錯誤進行分類處理:調試

@app.errorhandler(Exception) 
def all_exception_handler(e):
    # 對於 HTTP 異常,返回自帶的錯誤描述和狀態碼
    # 這些異常類在 Werkzeug 中定義,均繼承 HTTPException 類
    if isinstance(e, HTTPException):
        return e.desciption, e.code
    return 'Error', 500  # 通常異常複製代碼

若是你使用 Flask 0.12 版本,則須要參考這個 SO 回答重寫相關方法。code

附註一些關於錯誤處理的小知識:對象

  • 對於通常的程序異常(好比 NameError),若是沒有特定的異常處理函數,默認都會觸發 500 錯誤處理函數。
  • 開啓調試模式的時候,500 錯誤會顯示錯誤調試頁面。
  • 500 錯誤發生時傳入錯誤處理函數的是真正的異常對象,不是 Werkzeug 內置的 HTTP 異常類。
  • 內置的 HTTP 異常類的 description 和 code 屬性分別返回錯誤描述和狀態碼。
相關文章
相關標籤/搜索