Coverage for src/dataknobs_data/exceptions.py: 48%
63 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-17 16:10 -0500
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-17 16:10 -0500
1"""Custom exceptions for the dataknobs_data package."""
4class DataknobsDataError(Exception):
5 """Base exception for all dataknobs_data errors."""
7 pass
10class RecordNotFoundError(DataknobsDataError):
11 """Raised when a requested record is not found."""
13 def __init__(self, id: str):
14 self.id = id
15 super().__init__(f"Record with ID '{id}' not found")
18class RecordValidationError(DataknobsDataError):
19 """Raised when record validation fails."""
21 def __init__(self, message: str, field_name: str = None):
22 self.field_name = field_name
23 if field_name:
24 message = f"Field '{field_name}': {message}"
25 super().__init__(message)
28class FieldTypeError(DataknobsDataError):
29 """Raised when a field type operation fails."""
31 def __init__(self, field_name: str, expected_type: str, actual_type: str):
32 self.field_name = field_name
33 self.expected_type = expected_type
34 self.actual_type = actual_type
35 super().__init__(
36 f"Field '{field_name}' type mismatch: expected {expected_type}, got {actual_type}"
37 )
40class DatabaseError(DataknobsDataError):
41 """General database error."""
43 pass
46class DatabaseConnectionError(DataknobsDataError):
47 """Raised when database connection fails."""
49 def __init__(self, backend: str, message: str):
50 self.backend = backend
51 super().__init__(f"Failed to connect to {backend} backend: {message}")
54class DatabaseOperationError(DataknobsDataError):
55 """Raised when a database operation fails."""
57 def __init__(self, operation: str, message: str):
58 self.operation = operation
59 super().__init__(f"Database operation '{operation}' failed: {message}")
62class QueryError(DataknobsDataError):
63 """Raised when query execution fails."""
65 def __init__(self, message: str, query: "Query" = None):
66 self.query = query
67 super().__init__(f"Query error: {message}")
70class SerializationError(DataknobsDataError):
71 """Raised when serialization/deserialization fails."""
73 def __init__(self, format: str, message: str):
74 self.format = format
75 super().__init__(f"Serialization error ({format}): {message}")
78class DataFormatError(DataknobsDataError):
79 """Raised when data format is invalid or unsupported."""
81 def __init__(self, format: str, message: str):
82 self.format = format
83 super().__init__(f"Data format error ({format}): {message}")
86class BackendNotFoundError(DataknobsDataError):
87 """Raised when a requested backend is not available."""
89 def __init__(self, backend: str, available: list = None):
90 self.backend = backend
91 self.available = available or []
92 message = f"Backend '{backend}' not found"
93 if self.available:
94 message += f". Available backends: {', '.join(self.available)}"
95 super().__init__(message)
98class ConfigurationError(DataknobsDataError):
99 """Raised when configuration is invalid."""
101 def __init__(self, parameter: str, message: str):
102 self.parameter = parameter
103 super().__init__(f"Configuration error for '{parameter}': {message}")
106class ConcurrencyError(DataknobsDataError):
107 """Raised when a concurrency conflict occurs."""
109 def __init__(self, message: str):
110 super().__init__(f"Concurrency error: {message}")
113class TransactionError(DataknobsDataError):
114 """Raised when a transaction fails."""
116 def __init__(self, message: str):
117 super().__init__(f"Transaction error: {message}")
120class MigrationError(DataknobsDataError):
121 """Raised when data migration fails."""
123 def __init__(self, source: str, target: str, message: str):
124 self.source = source
125 self.target = target
126 super().__init__(f"Migration from {source} to {target} failed: {message}")