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_codes'] = exc.get_codes() 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)