Concrete error classes for common failure scenarios in library ecosystems
Domain-Specific Errors
These concrete error types provide semantic meaning for common failure scenarios across the library ecosystem. Each error type has sensible defaults for severity and retry behavior, but these can be overridden when needed.
ValidationError
For data validation failures, schema validation, and constraint violations.
ValidationError
def ValidationError( message:str, # User-friendly error message debug_info:Optional=None, # Optional developer details context:Optional=None, # Structured error context severity:ErrorSeverity=<ErrorSeverity.ERROR: 'error'>, # Error severity level is_retryable:bool=False, # Validation errors typically need fixes, not retries cause:Optional=None, # Original exception if chaining validation_errors:Optional=None, # Structured validation details):
Raised when validation fails.
Example: ValidationError
# Schema validation failureerror1 = ValidationError( message="Plugin configuration is invalid", debug_info="Field 'model_id' is required but missing", context=ErrorContext(plugin_id="whisper_large", operation="validate_config"), validation_errors={"model_id": "required field missing","temperature": "must be between 0.0 and 1.0" })print("Validation Error:", error1.get_user_message())print("Details:", error1.validation_errors)
Validation Error: Plugin configuration is invalid
Details: {'model_id': 'required field missing', 'temperature': 'must be between 0.0 and 1.0'}
# Resource validation failureerror2 = ValidationError( message="GPU unavailable for job execution", debug_info="GPU 0 in use by external process (PID 12345)", context=ErrorContext( job_id="job-123", plugin_id="whisper_large", operation="validate_resources", extra={"gpu_id": 0, "required_memory_mb": 8192} ))print("\nResource Validation:", error2.get_user_message())print("Debug:", error2.get_debug_message())
Resource Validation: GPU unavailable for job execution
Debug: GPU unavailable for job execution | Debug: GPU 0 in use by external process (PID 12345)
ConfigurationError
For configuration file issues, missing settings, and config loading/saving failures.
ConfigurationError
def ConfigurationError( message:str, # User-friendly error message debug_info:Optional=None, # Optional developer details context:Optional=None, # Structured error context severity:ErrorSeverity=<ErrorSeverity.ERROR: 'error'>, # Error severity level is_retryable:bool=False, # Config issues usually need manual fixes cause:Optional=None, # Original exception if chaining config_path:Optional=None, # Path to problematic config file):
Raised when configuration operations fail.
Example: ConfigurationError
# Config file not founderror3 = ConfigurationError( message="Configuration file not found", debug_info="Expected config at /home/user/.config/app/settings.json", context=ErrorContext(operation="load_config"), config_path="/home/user/.config/app/settings.json")print("Config Error:", error3.get_user_message())print("Path:", error3.config_path)
Config Error: Configuration file not found
Path: /home/user/.config/app/settings.json
# Config parse error with chainingimport jsontry: json.loads('{"broken": json}')except json.JSONDecodeError as e: error4 = ConfigurationError( message="Failed to parse configuration file", debug_info="JSON syntax error in config file", context=ErrorContext(plugin_id="whisper_base", operation="load_plugin_config"), config_path="configs/whisper_base.json", cause=e )print("\nConfig Parse Error:", error4.get_user_message())print("Debug:", error4.get_debug_message())
Config Parse Error: Failed to parse configuration file
Debug: Failed to parse configuration file | Debug: JSON syntax error in config file | Caused by: JSONDecodeError: Expecting value: line 1 column 12 (char 11)
ResourceError
For resource conflicts and availability issues (GPU busy, insufficient memory, etc.).
ResourceError
def ResourceError( message:str, # User-friendly error message debug_info:Optional=None, # Optional developer details context:Optional=None, # Structured error context severity:ErrorSeverity=<ErrorSeverity.WARNING: 'warning'>, # Often transient is_retryable:bool=True, # Resource conflicts may be temporary cause:Optional=None, # Original exception if chaining resource_type:Optional=None, # "GPU", "Memory", "Disk", etc. suggested_action:Optional=None, # Guidance for resolution):
Raised when resource conflicts or unavailability prevent operation.
Example: ResourceError
# GPU conflicterror5 = ResourceError( message="GPU currently unavailable", debug_info="GPU 0 in use by transcription worker (PID 54321)", context=ErrorContext( job_id="job-456", operation="start_job", extra={"gpu_id": 0, "conflicting_worker_pid": 54321} ), resource_type="GPU", suggested_action="Wait for current job to complete or cancel it", is_retryable=True)print("Resource Error:", error5.get_user_message())print("Resource type:", error5.resource_type)print("Suggested action:", error5.suggested_action)print("Retryable:", error5.is_retryable)
Resource Error: GPU currently unavailable
Resource type: GPU
Suggested action: Wait for current job to complete or cancel it
Retryable: True
# Memory errorerror6 = ResourceError( message="Insufficient memory to load model", debug_info="Required: 8GB, Available: 2GB", context=ErrorContext( plugin_id="whisper_large", operation="load_model", extra={"required_gb": 8, "available_gb": 2} ), severity=ErrorSeverity.ERROR, resource_type="Memory", suggested_action="Use a smaller model or free up system memory", is_retryable=False# Won't fix itself)print("\nMemory Error:", error6.get_user_message())print("Suggested action:", error6.suggested_action)
Memory Error: Insufficient memory to load model
Suggested action: Use a smaller model or free up system memory
PluginError
For plugin discovery, loading, initialization, and execution failures.
PluginError
def PluginError( message:str, # User-friendly error message debug_info:Optional=None, # Optional developer details context:Optional=None, # Structured error context severity:ErrorSeverity=<ErrorSeverity.ERROR: 'error'>, # Error severity level is_retryable:bool=False, # Plugin errors usually need fixes cause:Optional=None, # Original exception if chaining plugin_id:Optional=None, # ID of problematic plugin plugin_name:Optional=None, # Name of problematic plugin):
Raised when plugin operations fail.
Example: PluginError
# Plugin not founderror7 = PluginError( message="Plugin not found", debug_info="No plugin registered with ID 'transcription_whisper_huge'", context=ErrorContext(operation="load_plugin"), plugin_id="transcription_whisper_huge")print("Plugin Error:", error7.get_user_message())print("Plugin ID:", error7.plugin_id)
Plugin Error: Plugin not found
Plugin ID: transcription_whisper_huge