Coverage for src/dataknobs_data/exceptions.py: 49%
65 statements
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-31 07:20 -0600
« prev ^ index » next coverage.py v7.10.3, created at 2025-08-31 07:20 -0600
1"""Custom exceptions for the dataknobs_data package."""
3from __future__ import annotations
5from typing import TYPE_CHECKING
7if TYPE_CHECKING:
8 from dataknobs_data.query import Query
11class DataknobsDataError(Exception):
12 """Base exception for all dataknobs_data errors."""
14 pass
17class RecordNotFoundError(DataknobsDataError):
18 """Raised when a requested record is not found."""
20 def __init__(self, id: str):
21 self.id = id
22 super().__init__(f"Record with ID '{id}' not found")
25class RecordValidationError(DataknobsDataError):
26 """Raised when record validation fails."""
28 def __init__(self, message: str, field_name: str | None = None):
29 self.field_name = field_name
30 if field_name:
31 message = f"Field '{field_name}': {message}"
32 super().__init__(message)
35class FieldTypeError(DataknobsDataError):
36 """Raised when a field type operation fails."""
38 def __init__(self, field_name: str, expected_type: str, actual_type: str):
39 self.field_name = field_name
40 self.expected_type = expected_type
41 self.actual_type = actual_type
42 super().__init__(
43 f"Field '{field_name}' type mismatch: expected {expected_type}, got {actual_type}"
44 )
47class DatabaseError(DataknobsDataError):
48 """General database error."""
50 pass
53class DatabaseConnectionError(DataknobsDataError):
54 """Raised when database connection fails."""
56 def __init__(self, backend: str, message: str):
57 self.backend = backend
58 super().__init__(f"Failed to connect to {backend} backend: {message}")
61class DatabaseOperationError(DataknobsDataError):
62 """Raised when a database operation fails."""
64 def __init__(self, operation: str, message: str):
65 self.operation = operation
66 super().__init__(f"Database operation '{operation}' failed: {message}")
69class QueryError(DataknobsDataError):
70 """Raised when query execution fails."""
72 def __init__(self, message: str, query: Query | None = None):
73 self.query = query
74 super().__init__(f"Query error: {message}")
77class SerializationError(DataknobsDataError):
78 """Raised when serialization/deserialization fails."""
80 def __init__(self, format: str, message: str):
81 self.format = format
82 super().__init__(f"Serialization error ({format}): {message}")
85class DataFormatError(DataknobsDataError):
86 """Raised when data format is invalid or unsupported."""
88 def __init__(self, format: str, message: str):
89 self.format = format
90 super().__init__(f"Data format error ({format}): {message}")
93class BackendNotFoundError(DataknobsDataError):
94 """Raised when a requested backend is not available."""
96 def __init__(self, backend: str, available: list | None = None):
97 self.backend = backend
98 self.available = available or []
99 message = f"Backend '{backend}' not found"
100 if self.available:
101 message += f". Available backends: {', '.join(self.available)}"
102 super().__init__(message)
105class ConfigurationError(DataknobsDataError):
106 """Raised when configuration is invalid."""
108 def __init__(self, parameter: str, message: str):
109 self.parameter = parameter
110 super().__init__(f"Configuration error for '{parameter}': {message}")
113class ConcurrencyError(DataknobsDataError):
114 """Raised when a concurrency conflict occurs."""
116 def __init__(self, message: str):
117 super().__init__(f"Concurrency error: {message}")
120class TransactionError(DataknobsDataError):
121 """Raised when a transaction fails."""
123 def __init__(self, message: str):
124 super().__init__(f"Transaction error: {message}")
127class MigrationError(DataknobsDataError):
128 """Raised when data migration fails."""
130 def __init__(self, source: str, target: str, message: str):
131 self.source = source
132 self.target = target
133 super().__init__(f"Migration from {source} to {target} failed: {message}")