1+ from typing import Any , ClassVar
2+
13from archipy .models .dtos .error_dto import ErrorDetailDTO
24from archipy .models .errors .base_error import BaseError
35from archipy .models .types .error_message_types import ErrorMessageType
46from archipy .models .types .language_type import LanguageType
57
68
79class InternalError (BaseError ):
8- """Exception raised for unexpected internal errors."""
9-
10- def __init__ (
11- self ,
12- lang : LanguageType | None = None ,
13- error : ErrorDetailDTO = ErrorMessageType .INTERNAL_ERROR .value ,
14- additional_data : dict | None = None ,
15- ) -> None :
16- super ().__init__ (error , lang , additional_data )
10+ """Represents an internal server error.
1711
18-
19- class UnknownError ( BaseError ):
20- """Exception raised for unknown or unexpected error conditions."""
12+ This error is typically used when an unexpected condition is encountered
13+ that prevents the server from fulfilling the request.
14+ """
2115
2216 def __init__ (
2317 self ,
2418 error_code : str | None = None ,
2519 lang : LanguageType | None = None ,
26- error : ErrorDetailDTO = ErrorMessageType .UNKNOWN_ERROR .value ,
27- additional_data : dict | None = None ,
20+ error : ErrorDetailDTO = ErrorMessageType .INTERNAL_ERROR .value ,
21+ additional_data : dict [ str , Any ] | None = None ,
2822 ) -> None :
2923 data = {}
3024 if error_code :
@@ -34,16 +28,20 @@ def __init__(
3428 super ().__init__ (error , lang , data if data else None )
3529
3630
37- class AbortedError (BaseError ):
38- """Exception raised when an operation is aborted."""
31+ class ConfigurationError (BaseError ):
32+ """Represents a configuration error.
33+
34+ This error is used when there is a problem with the application's
35+ configuration that prevents it from operating correctly.
36+ """
3937
4038 def __init__ (
4139 self ,
4240 operation : str | None = None ,
4341 reason : str | None = None ,
4442 lang : LanguageType | None = None ,
45- error : ErrorDetailDTO = ErrorMessageType .ABORTED .value ,
46- additional_data : dict | None = None ,
43+ error : ErrorDetailDTO = ErrorMessageType .CONFIGURATION_ERROR .value ,
44+ additional_data : dict [ str , Any ] | None = None ,
4745 ) -> None :
4846 data = {}
4947 if operation :
@@ -55,15 +53,19 @@ def __init__(
5553 super ().__init__ (error , lang , data if data else None )
5654
5755
58- class DeadlockDetectedError (BaseError ):
59- """Exception raised when a deadlock is detected in the system."""
56+ class UnavailableError (BaseError ):
57+ """Represents a resource unavailability error.
58+
59+ This error is used when a required resource is temporarily unavailable
60+ but may become available again in the future.
61+ """
6062
6163 def __init__ (
6264 self ,
6365 resource_type : str | None = None ,
6466 lang : LanguageType | None = None ,
65- error : ErrorDetailDTO = ErrorMessageType .DEADLOCK .value ,
66- additional_data : dict | None = None ,
67+ error : ErrorDetailDTO = ErrorMessageType .UNAVAILABLE .value ,
68+ additional_data : dict [ str , Any ] | None = None ,
6769 ) -> None :
6870 data = {}
6971 if resource_type :
@@ -73,15 +75,19 @@ def __init__(
7375 super ().__init__ (error , lang , data if data else None )
7476
7577
76- class ConfigurationError (BaseError ):
77- """Exception raised for system configuration errors."""
78+ class UnknownError (BaseError ):
79+ """Represents an unknown error.
80+
81+ This is a catch-all error type for unexpected conditions that
82+ don't fit into other error categories.
83+ """
7884
7985 def __init__ (
8086 self ,
8187 config_key : str | None = None ,
8288 lang : LanguageType | None = None ,
83- error : ErrorDetailDTO = ErrorMessageType .CONFIGURATION_ERROR .value ,
84- additional_data : dict | None = None ,
89+ error : ErrorDetailDTO = ErrorMessageType .UNKNOWN_ERROR .value ,
90+ additional_data : dict [ str , Any ] | None = None ,
8591 ) -> None :
8692 data = {}
8793 if config_key :
@@ -91,16 +97,45 @@ def __init__(
9197 super ().__init__ (error , lang , data if data else None )
9298
9399
94- class UnavailableError (BaseError ):
95- """Exception raised when a requested service or feature is unavailable."""
100+ class AbortedError (BaseError ):
101+ """Represents an aborted operation error.
102+
103+ This error is used when an operation is aborted, typically due to
104+ a concurrency issue or user cancellation.
105+ """
106+
107+ def __init__ (
108+ self ,
109+ service : str | None = None ,
110+ reason : str | None = None ,
111+ lang : LanguageType | None = None ,
112+ error : ErrorDetailDTO = ErrorMessageType .UNAVAILABLE .value ,
113+ additional_data : dict [str , Any ] | None = None ,
114+ ) -> None :
115+ data = {}
116+ if service :
117+ data ["service" ] = service
118+ if reason :
119+ data ["reason" ] = reason
120+ if additional_data :
121+ data .update (additional_data )
122+ super ().__init__ (error , lang , data if data else None )
123+
124+
125+ class DeadlockDetectedError (BaseError ):
126+ """Represents a deadlock detection error.
127+
128+ This error is used when a deadlock is detected in a system operation,
129+ typically in database transactions or resource locking scenarios.
130+ """
96131
97132 def __init__ (
98133 self ,
99134 service : str | None = None ,
100135 reason : str | None = None ,
101136 lang : LanguageType | None = None ,
102137 error : ErrorDetailDTO = ErrorMessageType .UNAVAILABLE .value ,
103- additional_data : dict | None = None ,
138+ additional_data : dict [ str , Any ] | None = None ,
104139 ) -> None :
105140 data = {}
106141 if service :
@@ -110,3 +145,93 @@ def __init__(
110145 if additional_data :
111146 data .update (additional_data )
112147 super ().__init__ (error , lang , data if data else None )
148+
149+
150+ class DeadlineExceededError (BaseError ):
151+ """Raised when an operation exceeds its deadline/timeout.
152+
153+ This error is typically used in decorators or functions that have
154+ time limits or deadlines for completion.
155+ """
156+
157+ http_status_code : ClassVar [int ] = 408 # Request Timeout
158+ grpc_status_code : ClassVar [int ] = 4 # DEADLINE_EXCEEDED
159+
160+ def __init__ (
161+ self ,
162+ timeout : int | None = None ,
163+ operation : str | None = None ,
164+ lang : LanguageType | None = None ,
165+ additional_data : dict [str , Any ] | None = None ,
166+ ) -> None :
167+ """Initialize DeadlineExceededError.
168+
169+ Args:
170+ timeout: The timeout value that was exceeded (in seconds).
171+ operation: The operation that exceeded the deadline.
172+ lang: The language for error messages.
173+ additional_data: Additional context data.
174+ """
175+ error = ErrorDetailDTO (
176+ code = "DEADLINE_EXCEEDED" ,
177+ message_en = "Operation exceeded its deadline" ,
178+ message_fa = "عملیات از مهلت زمانی مجاز تجاوز کرد" ,
179+ http_status = self .http_status_code ,
180+ grpc_status = self .grpc_status_code ,
181+ )
182+
183+ data = {}
184+ if timeout is not None :
185+ data ["timeout" ] = timeout
186+ if operation :
187+ data ["operation" ] = operation
188+ if additional_data :
189+ data .update (additional_data )
190+ super ().__init__ (error , lang , data if data else None )
191+
192+
193+ class DeprecationError (BaseError ):
194+ """Raised when deprecated functionality is used.
195+
196+ This error is used to signal that a feature, method, or API
197+ is deprecated and should no longer be used.
198+ """
199+
200+ http_status_code : ClassVar [int ] = 410 # Gone
201+ grpc_status_code : ClassVar [int ] = 12 # UNIMPLEMENTED
202+
203+ def __init__ (
204+ self ,
205+ deprecated_feature : str | None = None ,
206+ replacement : str | None = None ,
207+ removal_version : str | None = None ,
208+ lang : LanguageType | None = None ,
209+ additional_data : dict [str , Any ] | None = None ,
210+ ) -> None :
211+ """Initialize DeprecationError.
212+
213+ Args:
214+ deprecated_feature: The name of the deprecated feature.
215+ replacement: The recommended replacement feature.
216+ removal_version: The version when the feature will be removed.
217+ lang: The language for error messages.
218+ additional_data: Additional context data.
219+ """
220+ error = ErrorDetailDTO (
221+ code = "DEPRECATED_FEATURE" ,
222+ message_en = "This feature is deprecated and should no longer be used" ,
223+ message_fa = "این ویژگی منسوخ شده و دیگر نباید استفاده شود" ,
224+ http_status = self .http_status_code ,
225+ grpc_status = self .grpc_status_code ,
226+ )
227+
228+ data = {}
229+ if deprecated_feature :
230+ data ["deprecated_feature" ] = deprecated_feature
231+ if replacement :
232+ data ["replacement" ] = replacement
233+ if removal_version :
234+ data ["removal_version" ] = removal_version
235+ if additional_data :
236+ data .update (additional_data )
237+ super ().__init__ (error , lang , data if data else None )
0 commit comments