""" Core exceptions — standard error hierarchy for all apps. All app-level exceptions should inherit from AppError. """ class AppError(Exception): """Base exception for all application errors.""" def __init__(self, message: str = "An application error occurred.", code: str = "APP_ERROR"): self.message = message self.code = code super().__init__(self.message) class AuthenticationError(AppError): """Authentication-related errors.""" def __init__(self, message: str = "Authentication failed."): super().__init__(message, code="AUTH_ERROR") class AuthorizationError(AppError): """Authorization/permission errors.""" def __init__(self, message: str = "Permission denied."): super().__init__(message, code="AUTHZ_ERROR") class ValidationError(AppError): """Business-rule validation errors.""" def __init__(self, message: str = "Validation failed."): super().__init__(message, code="VALIDATION_ERROR") class NotFoundError(AppError): """Resource not found errors.""" def __init__(self, message: str = "Resource not found."): super().__init__(message, code="NOT_FOUND") class RateLimitError(AppError): """Rate limiting errors.""" def __init__(self, message: str = "Too many requests. Please try again later."): super().__init__(message, code="RATE_LIMIT") class EncryptionError(AppError): """Encryption/decryption errors.""" def __init__(self, message: str = "Encryption operation failed."): super().__init__(message, code="ENCRYPTION_ERROR")