默認情況下,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對象。
