Esempio n. 1
0
def exception_handler(exc, context=None):
    """
    Call REST framework's default exception handler first.
    Return None if the exception can not be handled.
    :param exc:
    :param context:
    :return: Response or None
    """
    message = traceback.format_exc()
    response = rest_exception_handler(exc, context)

    if response is not None and isinstance(exc, BaseAPIBusinessError):
        logger.warning(message)
        response.data['error_code'] = response.data['detail'].code
        return response

    if response is not None and isinstance(exc, BaseAPISystemError):
        logger.error(message)
        response.data['error_code'] = response.data['detail'].code
        return response

    if response is not None:
        return response

    logger.error(message)
    return Response(
        {
            'error_code': BaseAPISystemError.default_code,
            'detail': BaseAPISystemError.default_detail,
        },
        status=BaseAPISystemError.status_code)
Esempio n. 2
0
def exception_handler(exc: Exception,
                      context: ExceptionHandlerContext) -> Optional[Response]:
    if isinstance(exc, Error):
        sentry_report(exc, level='debug')

        if settings.DEBUG:
            if context['request'].content_type.startswith('application/json'):
                exc = exc(traceback=traceback.format_exc())
            else:
                return None
    elif isinstance(exc, APIException):
        sentry_report(exc, level='debug')
        exc = Error(context['request'],
                    exc.__class__.__name__,
                    detail=exc.detail,
                    status_code=exc.status_code)
    elif not isinstance(exc, (Http404, PermissionDenied)):
        event_id = sentry_report(exc)
        event_id = f'event_id: {event_id}' if event_id is not None else None

        if settings.DEBUG:
            return None
        else:
            exc = Error(context['request'], detail=event_id)

    return rest_exception_handler(exc, context)
Esempio n. 3
0
def exception_handler(exc, context):
    response = rest_exception_handler(exc, context)

    if response is None:
        if hasattr(exc, "name") and callable(exc.name):
            name = exc.name()
        else:
            name = exc.__class__.__name__

        response = {
            "detail": str(exc),
            "name": name
        }

        if settings.DEBUG:
            import traceback

            response['traceback'] = traceback.format_tb(exc.__traceback__)

        response = Response(response)
    else:
        response.data["name"] = exc.__class__.__name__

    response.status_code = 500

    return response
Esempio n. 4
0
def custom_exception_handler(exc, context):
    response = rest_exception_handler(exc, context)
    if isinstance(exc, DjangoValidationError):
        data = {'detail': exc.messages}
        set_rollback()
        return Response(data, status=status.HTTP_400_BAD_REQUEST)
    return response
Esempio n. 5
0
def exception_handler(exc, context):
    if isinstance(exc, exceptions.ValidationError):
        exc.detail = {
                'data': exc.detail,
                'detail': 'Unfortunately, there are some problems with the data you committed'
            }
    return rest_exception_handler(exc, context)
Esempio n. 6
0
def exception_handler(exc, context):
    if isinstance(exc, exceptions.ValidationError):
        exc.detail = {
            'data':
            exc.detail,
            'detail':
            'Unfortunately, there are some problems with the data you committed'
        }
    return rest_exception_handler(exc, context)
Esempio n. 7
0
def exception_handler(exc, context):
    # Call REST framework's default exception handler first,
    # to get the standard error response.
    response = rest_exception_handler(exc, context)

    # make sure if any error, we unset maintenance mode
    clear_maintain_task_id_cache()

    return response
def handle_api_exception(exception, context):
    response = rest_exception_handler(exception, context)
    if response:
        if isinstance(exception, Banned):
            response.data["ban"] = exception.ban.get_serialized_message()
        elif isinstance(exception, PermissionDenied):
            try:
                response.data["detail"] = exception.args[0]
            except IndexError:
                pass
        return response
def test_rest_framework_exception(exception):
    """Ensure response returned by our and rest_framework handler are equal."""
    rest_framework_response = rest_exception_handler(exception, {})

    response = exception_handler(exception, {})

    assert rest_framework_response
    assert response
    assert response.status_code == rest_framework_response.status_code
    assert set(response.items()) == set(rest_framework_response.items())
    assert response.data == rest_framework_response.data
Esempio n. 10
0
def handle_api_exception(exception, context):
    response = rest_exception_handler(exception, context)
    if response:
        if isinstance(exception, Banned):
            response.data["ban"] = exception.ban.get_serialized_message()
        elif isinstance(exception, PermissionDenied):
            try:
                response.data["detail"] = exception.args[0]
            except IndexError:
                pass
        return response
Esempio n. 11
0
def handle_api_exception(exception, context):
    response = rest_exception_handler(exception, context)
    if response:
        if isinstance(exception, Banned):
            response.data['ban'] = exception.ban
        elif isinstance(exception, PermissionDenied):
            try:
                response.data['detail'] = exception.args[0]
            except IndexError:
                pass
        return response
    else:
        return None
Esempio n. 12
0
def handle_api_exception(exception, context):
    response = rest_exception_handler(exception, context)
    if response:
        if isinstance(exception, Banned):
            response.data['ban'] = exception.ban
        elif isinstance(exception, PermissionDenied):
            try:
                response.data['detail'] = exception.args[0]
            except IndexError:
                pass
        return response
    else:
        return None
Esempio n. 13
0
def handle_api_exception(exception):
    response = rest_exception_handler(exception)
    if response:
        if isinstance(exception, PermissionDenied):
            try:
                response.data['detail'] = exception.args[0]
                try:
                    response.data.update(exception.args[1])
                except IndexError:
                    pass
            except IndexError:
                pass
        return response
    else:
        return None
Esempio n. 14
0
def handle_api_exception(exception):
    response = rest_exception_handler(exception)
    if response:
        if isinstance(exception, PermissionDenied):
            try:
                response.data['detail'] = exception.args[0]
                try:
                    response.data.update(exception.args[1])
                except IndexError:
                    pass
            except IndexError:
                pass
        return response
    else:
        return None
Esempio n. 15
0
def exception_handler(exc, context):
    response = rest_exception_handler(exc, context)

    if response is None:
        return response

    if 'status_code' in response.data:
        del response.data['status_code']

    if 'detail' in response.data:
        message = response.data['detail']
        del response.data['detail']
        response.data['message'] = message

    return response
Esempio n. 16
0
def handle_api_exception(exception, context):
    response = rest_exception_handler(exception, context)
    if response:
        if isinstance(exception, Banned):
            response.data = exception.ban.get_serialized_message()
        elif isinstance(exception, PermissionDenied) and exception.args:
            response.data = {
                'detail': six.text_type(exception),
            }
        elif isinstance(exception, Http404):
            response.data = {
                'detail': six.text_type(exception) or "NOT FOUND",
            }
        return response
    else:
        return None
Esempio n. 17
0
def exception_handler(exc, context):
    if isinstance(exc, exceptions.ValidationError):
        logging.warn(exc.detail)
        errors = []
        if isinstance(exc.detail, list):
            errors.extend(purify_error(exc.detail))
        if isinstance(exc.detail, dict):
            for field, errs in exc.detail.items():
                field = translate_error_field(field)
                if isinstance(errs, list):
                    errors.extend(purify_error(errs, field))
                else:
                    errors.append(purify_error(errs, field))
        data = {"detail": errors}
        return Response(data, status=exc.status_code)
    return rest_exception_handler(exc, context)
def test_other_exception(exception):
    """Ensure response returned by our and rest_framework handler are equal."""
    assert (exception_handler(exception,
                              {}) == rest_exception_handler(exception, {}))