website / src /backend /api /exceptions.py
Andrej Janchevski
Implement COINs predict endpoint
3ad32ba
from rest_framework.exceptions import APIException
from rest_framework.response import Response
from rest_framework.views import exception_handler
class ApiError(APIException):
def __init__(self, code, message, status_code=400, details=None):
self.code = code
self.detail = message
self.status_code = status_code
self.details = details or {}
class NotFoundError(ApiError):
def __init__(self, message, details=None):
super().__init__("NOT_FOUND", message, status_code=404, details=details)
class InvalidRequestError(ApiError):
def __init__(self, message, details=None):
super().__init__("INVALID_REQUEST", message, status_code=400, details=details)
class InferenceError(ApiError):
def __init__(self, message, details=None):
super().__init__("INFERENCE_ERROR", message, status_code=422, details=details)
class InferenceBusy(ApiError):
def __init__(self, message="Another inference is in progress.", details=None):
super().__init__("INFERENCE_BUSY", message, status_code=429, details=details)
class ModelUnavailable(ApiError):
def __init__(self, message, details=None):
super().__init__("MODEL_UNAVAILABLE", message, status_code=503, details=details)
def api_exception_handler(exc, context):
if isinstance(exc, ApiError):
return Response(
{"error": {"code": exc.code, "message": str(exc.detail), "details": exc.details}},
status=exc.status_code,
)
response = exception_handler(exc, context)
if response is not None:
code = "UNKNOWN_ERROR"
if response.status_code == 404:
code = "NOT_FOUND"
elif response.status_code == 400:
code = "INVALID_REQUEST"
response.data = {"error": {"code": code, "message": str(response.data), "details": {}}}
return response