如何在DRF异常处理器中判断是否触发500错误?
解决DRF自定义异常处理器中判断500错误(含原生Python异常)的问题
DRF默认的exception_handler仅处理其自身定义的APIException子类异常,对于ValueError这类Python原生异常会返回None,这类异常最终会被Django处理为500内部服务器错误。要实现对所有500相关错误的判断和统一处理,你可以按以下方式修改自定义异常处理器:
完整实现代码
from rest_framework.views import exception_handler from rest_framework.response import Response from rest_framework import status from rest_framework.exceptions import APIException def custom_exception_handler(exc, context): # 调用DRF默认异常处理器,获取初始响应 response = exception_handler(exc, context) # 处理DRF已捕获的异常(response不为None) if response is not None: response.data['status_code'] = response.status_code # 判断是否为500错误 if response.status_code == status.HTTP_500_INTERNAL_SERVER_ERROR: response.data['error_category'] = 'DRF API 异常' return response # 处理DRF未捕获的Python原生异常(response为None) # 这类异常默认触发Django的500错误,主动构造统一格式的500响应 if not isinstance(exc, APIException): return Response( data={ 'detail': str(exc), 'status_code': status.HTTP_500_INTERNAL_SERVER_ERROR, 'error_category': 'Python 原生异常' }, status=status.HTTP_500_INTERNAL_SERVER_ERROR ) return response
关键说明
区分异常类型:
- 当
response不为None时,说明是DRF已处理的APIException子类异常,直接通过response.status_code判断是否为500错误。 - 当
response为None时,说明是DRF未处理的原生Python异常,这类异常必然会触发500错误,因此我们主动构造状态码为500的响应。
- 当
统一响应格式:
无论是DRF抛出的500异常还是原生Python异常,都在响应数据中添加了status_code字段,同时用error_category区分异常来源,方便前端处理。配置生效:
在项目的settings.py中配置DRF使用该自定义异常处理器:REST_FRAMEWORK = { 'EXCEPTION_HANDLER': '你的应用路径.utils.custom_exception_handler' }
注意事项
- DEBUG模式下,Django会显示详细的错误调试页面,而非自定义响应。测试自定义处理器时可以将
DEBUG设为False,或在生产环境中验证效果。 - 可以根据业务需求调整响应数据的字段,比如添加请求路径、时间戳等信息。
内容的提问来源于stack exchange,提问作者thisisjab
相关产品推荐
相关产品推荐

