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

1"""Custom exceptions for the dataknobs_data package.""" 

2 

3 

4class DataknobsDataError(Exception): 

5 """Base exception for all dataknobs_data errors.""" 

6 

7 pass 

8 

9 

10class RecordNotFoundError(DataknobsDataError): 

11 """Raised when a requested record is not found.""" 

12 

13 def __init__(self, id: str): 

14 self.id = id 

15 super().__init__(f"Record with ID '{id}' not found") 

16 

17 

18class RecordValidationError(DataknobsDataError): 

19 """Raised when record validation fails.""" 

20 

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) 

26 

27 

28class FieldTypeError(DataknobsDataError): 

29 """Raised when a field type operation fails.""" 

30 

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 ) 

38 

39 

40class DatabaseError(DataknobsDataError): 

41 """General database error.""" 

42 

43 pass 

44 

45 

46class DatabaseConnectionError(DataknobsDataError): 

47 """Raised when database connection fails.""" 

48 

49 def __init__(self, backend: str, message: str): 

50 self.backend = backend 

51 super().__init__(f"Failed to connect to {backend} backend: {message}") 

52 

53 

54class DatabaseOperationError(DataknobsDataError): 

55 """Raised when a database operation fails.""" 

56 

57 def __init__(self, operation: str, message: str): 

58 self.operation = operation 

59 super().__init__(f"Database operation '{operation}' failed: {message}") 

60 

61 

62class QueryError(DataknobsDataError): 

63 """Raised when query execution fails.""" 

64 

65 def __init__(self, message: str, query: "Query" = None): 

66 self.query = query 

67 super().__init__(f"Query error: {message}") 

68 

69 

70class SerializationError(DataknobsDataError): 

71 """Raised when serialization/deserialization fails.""" 

72 

73 def __init__(self, format: str, message: str): 

74 self.format = format 

75 super().__init__(f"Serialization error ({format}): {message}") 

76 

77 

78class DataFormatError(DataknobsDataError): 

79 """Raised when data format is invalid or unsupported.""" 

80 

81 def __init__(self, format: str, message: str): 

82 self.format = format 

83 super().__init__(f"Data format error ({format}): {message}") 

84 

85 

86class BackendNotFoundError(DataknobsDataError): 

87 """Raised when a requested backend is not available.""" 

88 

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) 

96 

97 

98class ConfigurationError(DataknobsDataError): 

99 """Raised when configuration is invalid.""" 

100 

101 def __init__(self, parameter: str, message: str): 

102 self.parameter = parameter 

103 super().__init__(f"Configuration error for '{parameter}': {message}") 

104 

105 

106class ConcurrencyError(DataknobsDataError): 

107 """Raised when a concurrency conflict occurs.""" 

108 

109 def __init__(self, message: str): 

110 super().__init__(f"Concurrency error: {message}") 

111 

112 

113class TransactionError(DataknobsDataError): 

114 """Raised when a transaction fails.""" 

115 

116 def __init__(self, message: str): 

117 super().__init__(f"Transaction error: {message}") 

118 

119 

120class MigrationError(DataknobsDataError): 

121 """Raised when data migration fails.""" 

122 

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}")