operations_project/apps/template/exceptions.py

59 lines
2.0 KiB
Python
Raw Normal View History

2025-05-20 15:57:10 +08:00
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)