File size: 3,855 Bytes
53bec59 | 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 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | """
Custom Exception Classes for Production Error Handling
"""
from typing import Any, Dict, Optional
from fastapi import status
class AppException(Exception):
"""Base application exception"""
def __init__(
self,
message: str,
status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR,
details: Optional[Dict[str, Any]] = None
):
self.message = message
self.status_code = status_code
self.details = details or {}
super().__init__(self.message)
class ValidationError(AppException):
"""Validation error exception"""
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
details=details
)
class AuthenticationError(AppException):
"""Authentication error exception"""
def __init__(self, message: str = "Authentication failed"):
super().__init__(
message=message,
status_code=status.HTTP_401_UNAUTHORIZED,
details={"www_authenticate": "Bearer"}
)
class AuthorizationError(AppException):
"""Authorization error exception"""
def __init__(self, message: str = "Insufficient permissions"):
super().__init__(
message=message,
status_code=status.HTTP_403_FORBIDDEN
)
class ResourceNotFoundError(AppException):
"""Resource not found exception"""
def __init__(self, resource: str, identifier: Any):
super().__init__(
message=f"{resource} not found",
status_code=status.HTTP_404_NOT_FOUND,
details={"resource": resource, "identifier": str(identifier)}
)
class RateLimitExceededError(AppException):
"""Rate limit exceeded exception"""
def __init__(self, limit: int, window: str):
super().__init__(
message=f"Rate limit exceeded: {limit} requests per {window}",
status_code=status.HTTP_429_TOO_MANY_REQUESTS,
details={"limit": limit, "window": window}
)
class ModelLoadError(AppException):
"""ML model loading error"""
def __init__(self, model_name: str, reason: str):
super().__init__(
message=f"Failed to load model: {model_name}",
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
details={"model": model_name, "reason": reason}
)
class PredictionError(AppException):
"""ML prediction error"""
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
details=details
)
class FileUploadError(AppException):
"""File upload error"""
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
status_code=status.HTTP_400_BAD_REQUEST,
details=details
)
class DatabaseError(AppException):
"""Database operation error"""
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
details=details
)
class CacheError(AppException):
"""Cache operation error"""
def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
super().__init__(
message=message,
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
details=details
)
|