def exception_handler(exc, context):
    response = base_exception_handler(exc, context)

    if response is not None and isinstance(exc, APIException) and isinstance(response.data, dict):
        response.data['codes'] = exc.get_codes()

    return response
Example #2
0
def exception_handler(exc, context):
    """Handle an exception."""
    exc_type = type(exc)
    response = None

    if exc_type is ValidationError:
        if not getattr(exc, 'error_dict', None):
            exc = ValidationError({'error': exc})

        exc_data = core_validation_error_to_dict(exc)
        response = base_exception_handler(serializers.ValidationError(exc_data), context)
    elif exc_type is serializers.ValidationError:
        exc_data = rest_validation_error_to_dict(exc)
        response = base_exception_handler(serializers.ValidationError(exc_data), context)
    else:
        response = base_exception_handler(exc, context)

    return response
Example #3
0
def exception_handler(exc, context):
    response = base_exception_handler(exc, context)
    if response is not None:
        if isinstance(response.data, list):
            return response
        response.data['status_code'] = response.status_code
        if 'detail' in response.data:
            response.data['error'] = response.data['detail']
    return response
Example #4
0
def exception_handler(exc, context):
    # FIXME: implicit requests dependency
    if isinstance(exc, requests.exceptions.HTTPError):
        try:
            response_data = exc.response.json()
        except ValueError:
            pass
        else:
            # Override an exception if it's a pretty enough
            if is_pretty(response_data):
                status_code = exc.response.status_code

                exc = rest_framework.exceptions.APIException(
                    detail=response_data)
                exc.status_code = status_code

    response = base_exception_handler(exc, context)

    # Uncaught exception handling
    if not response:
        LOG.error("Exception occurred", exc_info=exc)

        exc = rest_framework.exceptions.APIException(exc)
        response = base_exception_handler(exc, context)
        response.data["detail"] = _("Internal error")

    if response is not None:
        if is_pretty(response.data):
            return response

        data = {"code": exc.__class__.__name__}

        if "detail" in response.data:
            description = response.data["detail"]
        else:
            description = exc.default_detail
            data["fields"] = response.data

        data["description"] = description

        response.data = data

    return response
Example #5
0
def exception_handler(exc, context):
    """Returns the response that should be used for any given exception."""
    response = base_exception_handler(exc, context)
    if response is not None:
        if isinstance(response.data, list):
            return response
        response.data["code"] = response.status_code
        if "detail" in response.data:
            response.data["error"] = response.data.pop("detail")
    return response
Example #6
0
def exception_handler(exc, context):
    response = base_exception_handler(exc, context)
    if isinstance(exc, exceptions.APIException):
        if isinstance(exc.detail, (list, dict)):
            data = exc.get_full_details()
        else:
            data = {'__global': exc.get_full_details()}
        response.data = data

    return response
Example #7
0
def exception_handler(exc, context):
    response = base_exception_handler(exc, context)

    if response is None:
        view = context["view"]
        logger.error(
            f"Unhandled {exc.__class__.__name__} exception in {view.__class__.__name__}",
            exc_info=exc,
        )
    return response
Example #8
0
def exception_handler(exc, context):
    from rest_framework.views import exception_handler as base_exception_handler
    response = base_exception_handler(exc, context)
    if isinstance(exc, exceptions.APIException):
        if isinstance(exc.detail, (list, dict)):
            data = exc.get_full_details()
        else:
            data = {'detail': exc.get_full_details()}
        response.data = data

    return response
Example #9
0
def exception_handler(exc, context):
    response = base_exception_handler(exc, context)

    if not response:
        logger.error(exc)
        response = Response(
            {
                "details": exc.args if settings.DEBUG else "not sure",
                "message": "Houston, we have a problem!"
            },
            status=500)
    return response
Example #10
0
def rest_framework_exception_handler(ex: Exception, context: dict):
    response = base_exception_handler(ex, context)

    if response:
        response.data = {
            'meta': {
                'error': ex.__class__.__name__,
                'error_message': getattr(ex, 'detail', ''),
                'status': response.status_code
            },
            'data': {}
        }

    return response
Example #11
0
def exception_handler(exc, context):
    """rest api异常处理

    :param exc: 异常
    :param context: 上下文
    :return: 请求响应
    """
    response = base_exception_handler(exc, context)
    if isinstance(exc, exceptions.APIException):
        if isinstance(exc.detail, (list, dict)):
            data = exc.get_full_details()
        else:
            data = {'__global': exc.get_full_details()}
        response.data = data.update({"code": 1})
    else:
        # 在此处补充自定义的异常处理
        if response is not None:
            response.data.update({"ActionStatus": "FAIL",
                                  "ErrorCode": -1,
                                  "Data": ""})
    return response
Example #12
0
def exception_handler(exc, context):
    """rest api异常处理

    :param exc: 异常
    :param context: 上下文
    :return: 请求响应
    """
    if hasattr(exc, "exc_type"):
        exec_type = getattr(exc, 'exc_type', None)
        if exec_type == "RestException":
            return Response(json.loads(exc.value),
                            status=status.HTTP_400_BAD_REQUEST)

    response = base_exception_handler(exc, context)
    if isinstance(exc, exceptions.APIException):
        if isinstance(exc.detail, (list, dict)):
            data = exc.get_full_details()
        else:
            data = {'__global': exc.get_full_details()}
        response.data = data

    return response
Example #13
0
def exception_handler(exc, context):
    _logger.warn(exc)
    return base_exception_handler(exc, context)
def exception_handler(exc, context):
    response = base_exception_handler(exc, context)

    if isinstance(exc, ValidationError):
        invalid_fields = []
        error_message = None

        if isinstance(response.data, list):
            for index, error_data in enumerate(response.data):
                for key, value in error_data.items():
                    logger.info('name: [{}, {}], message: {}'.format(index, key, value))
                    # field
                    if key == 'non_field_errors':
                        error_message = value
                        break

                    invalid_fields.append({'name': [index, key], 'message': value[0]})
        else:
            error_data = response.data
            for key, value in error_data.items():
                logger.info('name: {}, message: {}'.format(key, value))
                # field
                if key == 'non_field_errors':
                    error_message = value
                    break

                invalid_fields.append({'name': key, 'message': value[0]})

        if error_message:
            response.data = {'error_code': ErrorCode.VALIDATION_ERROR, 'error_message': error_message}
        else:
            response.data = {'error_code': ErrorCode.VALIDATION_ERROR, 'invalid_fields': invalid_fields}

    if isinstance(exc, ParseError):  # status_code: 400
        response.data = {'error_code': ErrorCode.PARSE_ERROR, 'error_message': exc.detail}

    if isinstance(exc, AuthenticationFailed):  # status_code: 401
        response.data = {'error_code': ErrorCode.AUTHENTICATION_FAILED, 'error_message': exc.detail}

    if isinstance(exc, NotAuthenticated):  # status_code: 401
        response.data = {'error_code': ErrorCode.NOT_AUTHENTICATED, 'error_message': exc.detail}

    if isinstance(exc, PermissionDenied):  # status_code: 403
        response.data = {'error_code': ErrorCode.PERMISSION_DENIED, 'error_message': exc.detail}

    if isinstance(exc, NotFound):  # status_code: 404
        response.data = {'error_code': ErrorCode.NOT_FOUND, 'error_message': exc.detail}

    if isinstance(exc, MethodNotAllowed):  # status_code: 405
        response.data = {'error_code': ErrorCode.METHOD_NOT_ALLOWED, 'error_message': exc.detail}

    if isinstance(exc, NotAcceptable):  # status_code: 406
        response.data = {'error_code': ErrorCode.NOT_ACCEPTABLE, 'error_message': exc.detail}

    if isinstance(exc, UnsupportedMediaType):  # status_code: 415
        response.data = {'error_code': ErrorCode.UNSUPPORTED_MEDIA_TYPE, 'error_message': exc.detail}

    if isinstance(exc, Throttled):  # status_code: 429
        response.data = {'error_code': ErrorCode.TOO_MANY_REQUESTS, 'error_message': exc.detail}

    # TODO: ValueError (from codes within Models)

    if response is not None and 'error_code' not in response.data:
        if isinstance(exc, APIException): #Custom Exception
            response.data = {'error_code': ErrorCode.CUSTOM_EXCEPTION, 'error_message': exc.detail}
            response.status_code = status.HTTP_400_BAD_REQUEST
        else:
            response.data = {'error_code': ErrorCode.UNHANDLED_EXCEPTION, 'error_message': '{}'.format(exc)}

    return response