from rest_framework.views import exception_handler from rest_framework.exceptions import APIException from rest_framework import status from django.http import Http404 from django.core.exceptions import ValidationError from django.db.utils import IntegrityError from rest_framework.response import Response def custom_exception_handler(exc, context): """ 自定义异常处理器,将所有异常转换为标准响应格式 Args: exc: 异常对象 context: 异常上下文 Returns: 标准格式的Response对象 """ response = exception_handler(exc, context) if response is not None: # 已经被DRF处理的异常,转换为标准格式 return Response({ 'code': response.status_code, 'message': str(exc), 'data': response.data if hasattr(response, 'data') else None }, status=response.status_code) # 如果是Django的404错误 if isinstance(exc, Http404): return Response({ 'code': status.HTTP_404_NOT_FOUND, 'message': '请求的资源不存在', 'data': None }, status=status.HTTP_404_NOT_FOUND) # 如果是验证错误 if isinstance(exc, ValidationError): return Response({ 'code': status.HTTP_400_BAD_REQUEST, 'message': '数据验证失败', 'data': str(exc) if str(exc) else '提供的数据无效' }, status=status.HTTP_400_BAD_REQUEST) # 如果是数据库完整性错误(如唯一约束) if isinstance(exc, IntegrityError): return Response({ 'code': status.HTTP_400_BAD_REQUEST, 'message': '数据库完整性错误', 'data': str(exc) }, status=status.HTTP_400_BAD_REQUEST) # 其他未处理的异常 return Response({ 'code': status.HTTP_500_INTERNAL_SERVER_ERROR, 'message': '服务器内部错误', 'data': str(exc) if str(exc) else None }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)