Datavision / backend /app /core /exceptions.py
DataVision CI/CD Bot
release: clean production build for HuggingFace Space
09801ca
Raw
History Blame Contribute Delete
2.48 kB
"""
Custom Exception Classes — Consistent error handling across the application.
"""
from fastapi import HTTPException, status
class DataVisionException(Exception):
"""Base exception for all DataVision errors."""
def __init__(self, message: str, error_code: str = "INTERNAL_ERROR"):
self.message = message
self.error_code = error_code
super().__init__(message)
class AuthenticationError(DataVisionException):
"""Raised when authentication fails."""
def __init__(self, message: str = "Authentication failed"):
super().__init__(message, error_code="AUTH_FAILED")
class AuthorizationError(DataVisionException):
"""Raised when user lacks required permissions."""
def __init__(self, message: str = "Insufficient permissions"):
super().__init__(message, error_code="FORBIDDEN")
class NotFoundError(DataVisionException):
"""Raised when a resource is not found."""
def __init__(self, resource: str, identifier: str = ""):
msg = f"{resource} not found"
if identifier:
msg = f"{resource} '{identifier}' not found"
super().__init__(msg, error_code="NOT_FOUND")
class ConflictError(DataVisionException):
"""Raised when a resource already exists."""
def __init__(self, message: str = "Resource already exists"):
super().__init__(message, error_code="CONFLICT")
class ValidationError(DataVisionException):
"""Raised when input validation fails."""
def __init__(self, message: str = "Validation failed"):
super().__init__(message, error_code="VALIDATION_ERROR")
class RateLimitError(DataVisionException):
"""Raised when rate limit is exceeded."""
def __init__(self, message: str = "Rate limit exceeded"):
super().__init__(message, error_code="RATE_LIMIT")
def to_http_exception(exc: DataVisionException) -> HTTPException:
"""Convert a DataVisionException to an HTTPException."""
status_map = {
"AUTH_FAILED": status.HTTP_401_UNAUTHORIZED,
"FORBIDDEN": status.HTTP_403_FORBIDDEN,
"NOT_FOUND": status.HTTP_404_NOT_FOUND,
"CONFLICT": status.HTTP_409_CONFLICT,
"VALIDATION_ERROR": status.HTTP_422_UNPROCESSABLE_ENTITY,
"RATE_LIMIT": status.HTTP_429_TOO_MANY_REQUESTS,
"INTERNAL_ERROR": status.HTTP_500_INTERNAL_SERVER_ERROR,
}
return HTTPException(
status_code=status_map.get(exc.error_code, 500),
detail=exc.message,
)