DRf,处理未处理的异常

时间:2017-06-01 03:24:39

标签: django django-rest-framework

使用DRF时,不会处理Django的ValueError(django.core.exceptions)和IntegrityError(django.db)。

DRF的def exception_handler具有异常处理代码(APIException,Http404,PermissionDenied)

以下是Http404

的代码
 elif isinstance(exc, Http404):
     msg = _('Not found.')
     data = {'detail': six.text_type(msg)}

     set_rollback()
     return Response(data, status=status.HTTP_404_NOT_FOUND)

所以我可以创建我的自定义异常处理程序

 def custom_exception_handler(exc, context):
     # Call REST framework's default exception handler first,
     # to get the standard error response.
     response = exception_handler(exc, context)

     if isinstance(exc, ValidationError) or isinstance(exc, IntegrityError):
         data = {
             'errors': str(exc)
         }
         set_rollback()   # not sure about this line
         response = Response(data, status=status.HTTP_500_INTERNAL_SERVER_ERROR)

     return response

我不确定代码中set_rollback()行的用途,也不确定这段代码是否安全。

1 个答案:

答案 0 :(得分:1)

DRF中默认不处理IntegrityErrorValueError的原因是因为需要根据具体情况处理它们。因此,编写一个通用的异常处理程序,就像你在这里尝试做的那样,可能不是正确的方法。

例如,某些IntegrityErrors可能只是被忽略,但有些类似的情况发生在资金转移的中间不可能。最好尝试这样的事情:

def create(self, request):
    try :
        return super(MyViewSet, self).create(request)
    except IntergrityError:
        # your decision here how to handle it.
        raise APIException(detail='Custom message')