DRF的異常處理


默認情況下,DRF框架通過內置的 exception_handler 方法,處理了如下異常:

  • django內置異常
    • Http404
    • PermissionDenied
  • DRF框架異常

    • APIException - DRF 框架異常的父類,以下為它的子類
      • NotFound 未找到
      • PermissionDenied 權限拒絕
      • ParseError 解析錯誤
      • AuthenticationFailed 認證失敗
      • NotAuthenticated 尚未認證
      • MethodNotAllowed 請求方式不支持
      • Throttled 超過限流次數
      • ValidationError 校驗失敗
      • NotAcceptable 要獲取的數據格式不支持
  • 如果 exception_handler 方法處理異常成功,則返回一個Response對象,否則返回None

 

如果發生了上面的這些異常,DRF框架的excaption_handler函數可以自動捕獲異常,然后進行處理,返回Response對象。如果不是上面的這些異常,則處理不了,返回None。

 

那我們在生產環境中,需要把全部異常捕獲,輸入到日志中。而且我們也不希望給錯誤頁面給用戶看到,這時候應該怎么辦呢?

這時候可以針對 DRF 框架沒有處理的一些特殊的異常,進行全局的異常處理。

示例:

from rest_framework.response import Response
from rest_framework.views import exception_handler

def custom_exception_handler(exc, context):
    # 先調用DRF默認的 exception_handler 方法, 對異常進行處理,
    # 如果處理成功,會返回一個`Response`類型的對象
    response = exception_handler(exc, context)

    if response is None:
        # 項目出錯了,但DRF框架對出錯的異常沒有處理,
        # 可以在此處對異常進行統一處理,比如:保存出錯信息到日志文件
        view = context['view']      # 出錯的視圖
        error = '服務器內部錯誤, %s' % exc
        print('%s: %s' % (view, error))
        return Response({'detail': error}, status=500)

    return response

 

最后還需要在配置文件中聲明自定義的異常處理

REST_FRAMEWORK = {
    'EXCEPTION_HANDLER': 'DjangoREST.exceptions.custom_exception_handler'
}

 

這時候如果有其他異常出現,就可以捕獲並且處理啦,也能返回Response對象。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM