Django+DRF 實戰:自定義異常處理流程
一、DRF 異常處理流程
DRF 默認異常處理流程
DRF默認的異常處理流程如下:
- 當異常發生時,會自動調用
rest_framework.views.exception_handler函數來處理異常。 - 該函數對DRF異常(即繼承了
APIException類)和Django內置的Http404、PermissionDenied異常,提取錯誤信息并返回響應 - 其它異常不處理,返回None(拋出到外層)。
源碼
下面是DRF的exception_handler 異常處理函數源碼
# rest_framework.views.py
def exception_handler(exc, context):
if isinstance(exc, Http404):
exc = exceptions.NotFound(*(exc.args))
elif isinstance(exc, PermissionDenied):
exc = exceptions.PermissionDenied(*(exc.args))
if isinstance(exc, exceptions.APIException):
headers = {}
if getattr(exc, 'auth_header', None):
headers['WWW-Authenticate'] = exc.auth_header
if getattr(exc, 'wait', None):
headers['Retry-After'] = '%d' % exc.wait
if isinstance(exc.detail, (list, dict)):
data = exc.detail
else:
data = {'detail': exc.detail}
set_rollback()
return Response(data, status=exc.status_code, headers=headers)
return None
二、實戰
DRF 自定義異常處理流程
DRF 自定義異常處理流程示例:
- 定義
custom_exception_handler函數,作為DRF的全局異常處理器 - 該函數記錄詳細的錯誤日志,包括用戶、IP、請求路徑、方法、視圖及異常信息。然后,統一返回錯誤響應格式
- 若異常未被 DRF 捕獲,返回 500 錯誤或特定 ProtectedError 提示
- 若為 DRF 的
ValidationError或 Django 的驗證錯誤,調用對應處理函數提取錯誤信息 - 其他異常則根據狀態碼返回預定義的友好提示

應用自定義異常處理流程
在 settings.py 中,配置DRF自定義異常處理函數,作為全局異常處理器。
REST_FRAMEWORK = {
# ...
# 全局異常處理
"EXCEPTION_HANDLER": "mars_framework.exceptions.base.custom_exception_handler",
# ...
}
您正在閱讀的是《Django從入門到實戰》專欄!關注不迷路~

本文詳解DRF異常處理流程,包括默認處理機制與自定義異常處理器的實現方法。通過源碼分析和實戰示例,講解如何全局捕獲并統一返回錯誤信息,并結合日志記錄與友好提示提升項目健壯性。適用于Django進階開發。
浙公網安備 33010602011771號