59 lines
2.1 KiB
Python
59 lines
2.1 KiB
Python
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) |