You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键说明

  1. 区分异常类型:

    • 当response不为None时,说明是DRF已处理的APIException子类异常,直接通过response.status_code判断是否为500错误。
    • 当response为None时,说明是DRF未处理的原生Python异常,这类异常必然会触发500错误,因此我们主动构造状态码为500的响应。
  2. 统一响应格式:
    无论是DRF抛出的500异常还是原生Python异常,都在响应数据中添加了status_code字段,同时用error_category区分异常来源,方便前端处理。

  3. 配置生效:
    在项目的settings.py中配置DRF使用该自定义异常处理器:

    REST_FRAMEWORK = {
        'EXCEPTION_HANDLER': '你的应用路径.utils.custom_exception_handler'
    }
    

注意事项

  • DEBUG模式下,Django会显示详细的错误调试页面,而非自定义响应。测试自定义处理器时可以将DEBUG设为False,或在生产环境中验证效果。
  • 可以根据业务需求调整响应数据的字段,比如添加请求路径、时间戳等信息。

内容的提问来源于stack exchange,提问作者thisisjab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 06:43:12