File size: 1,872 Bytes
0b4eacc 3ad32ba 0b4eacc | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | 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
|