initial project setup with README and ignore
This commit is contained in:
70
app/core/exceptions.py
Normal file
70
app/core/exceptions.py
Normal file
@@ -0,0 +1,70 @@
|
||||
"""Custom exceptions for the API."""
|
||||
|
||||
from fastapi import HTTPException, status
|
||||
|
||||
|
||||
class APIException(HTTPException):
|
||||
"""Base API exception with structured error format."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
status_code: int,
|
||||
message: str,
|
||||
field: str = None,
|
||||
code: str = None,
|
||||
detail: str = None
|
||||
):
|
||||
self.message = message
|
||||
self.field = field
|
||||
self.code = code or self._get_default_code(status_code)
|
||||
super().__init__(status_code=status_code, detail=detail or message)
|
||||
|
||||
def _get_default_code(self, status_code: int) -> str:
|
||||
"""Get default error code based on status code."""
|
||||
codes = {
|
||||
400: "BAD_REQUEST",
|
||||
401: "UNAUTHORIZED",
|
||||
403: "FORBIDDEN",
|
||||
404: "NOT_FOUND",
|
||||
409: "CONFLICT",
|
||||
422: "VALIDATION_ERROR",
|
||||
429: "RATE_LIMIT_EXCEEDED",
|
||||
500: "INTERNAL_SERVER_ERROR",
|
||||
503: "SERVICE_UNAVAILABLE"
|
||||
}
|
||||
return codes.get(status_code, "UNKNOWN_ERROR")
|
||||
|
||||
|
||||
class ValidationError(APIException):
|
||||
"""Validation error exception."""
|
||||
|
||||
def __init__(self, message: str, field: str = None):
|
||||
super().__init__(
|
||||
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
|
||||
message=message,
|
||||
field=field,
|
||||
code="VALIDATION_ERROR"
|
||||
)
|
||||
|
||||
|
||||
class NotFoundError(APIException):
|
||||
"""Resource not found exception."""
|
||||
|
||||
def __init__(self, message: str = "Resource not found"):
|
||||
super().__init__(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
message=message,
|
||||
code="NOT_FOUND"
|
||||
)
|
||||
|
||||
|
||||
class RateLimitError(APIException):
|
||||
"""Rate limit exceeded exception."""
|
||||
|
||||
def __init__(self, message: str = "Rate limit exceeded"):
|
||||
super().__init__(
|
||||
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
|
||||
message=message,
|
||||
code="RATE_LIMIT_EXCEEDED"
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user