47 lines
1.6 KiB
Python
47 lines
1.6 KiB
Python
from typing import Tuple
|
|
from django.core.exceptions import PermissionDenied
|
|
from django.http import Http404
|
|
from server.settings import myLogger
|
|
from rest_framework.response import Response
|
|
from rest_framework import exceptions
|
|
from rest_framework.views import set_rollback
|
|
from django.utils.translation import gettext_lazy as _
|
|
import traceback
|
|
|
|
class MyError(exceptions.ParseError):
|
|
"""自定义业务异常
|
|
"""
|
|
|
|
def __init__(self, error:Tuple[str, str]=(), detail=None, code=None):
|
|
if error:
|
|
code, detail = error
|
|
super().__init__(detail, code)
|
|
|
|
def custom_exception_hander(exc, context):
|
|
"""
|
|
自定义异常处理
|
|
"""
|
|
if isinstance(exc, Http404):
|
|
exc = exceptions.NotFound()
|
|
elif isinstance(exc, PermissionDenied):
|
|
exc = exceptions.PermissionDenied()
|
|
|
|
if isinstance(exc, exceptions.APIException):
|
|
headers = {}
|
|
if getattr(exc, 'auth_header', None):
|
|
headers['WWW-Authenticate'] = exc.auth_header
|
|
if getattr(exc, 'wait', None):
|
|
headers['Retry-After'] = '%d' % exc.wait
|
|
|
|
if isinstance(exc.detail, (list, dict)):
|
|
data = {'err_detail':exc.detail}
|
|
data['err_code'] = exc.default_code
|
|
data['err_msg'] = exc.default_detail
|
|
else:
|
|
data = {'err_msg': exc.detail, 'err_code':exc.get_codes()}
|
|
|
|
set_rollback()
|
|
return Response(data, status=exc.status_code, headers=headers)
|
|
# 未处理的异常记录日志
|
|
myLogger.error(traceback.format_exc())
|
|
return Response(data={'err_code':'server_error', 'err_msg':'服务器错误'}, status=500) |