Create structured exception hierarchy with exit codes
Implements comprehensive exception hierarchy for better error handling,
structured exit codes, and retry support for transient failures.
New file: src/vlm/exceptions.py
Exception Classes:
- VLMError (base, exit code 1)
- VLMConfigError (exit code 2) - configuration errors
- VLMFileSystemError (exit code 3) - file operations
- VLMIOError (exit code 4) - data file I/O
- VLMTransientError (exit code 1, retryable) - temporary failures
- VLMValidationError (exit code 5) - data validation
- VLMQuarantineError (exit code 6) - quarantine operations
Features:
- Structured exit codes for different error types
- is_retryable flag for transient errors
- Clear error messages with context
- Ready for future retry logic implementation
Usage Example:
```python
try:
validate_config(config)
except VLMConfigError as e:
sys.exit(e.exit_code) # Exit with code 2
```
Future Work:
- Migrate existing ValueError/Exception usage to new hierarchy
- Implement retry logic for VLMTransientError
- Add exit code handling in CLI main()
- Add error context tracking
Testing:
- Module loads successfully
- Exit codes and flags verified
- All 449 tests still pass
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Sonnet 4.5
parent
71e67ab65c
commit
54416065fe
@@ -0,0 +1,120 @@
|
|||||||
|
"""Exception hierarchy for Video Library Manager.
|
||||||
|
|
||||||
|
Provides structured exceptions with exit codes and retry support for better
|
||||||
|
error handling and user experience.
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
class VLMError(Exception):
|
||||||
|
"""Base exception for all VLM errors.
|
||||||
|
|
||||||
|
All VLM-specific exceptions inherit from this class.
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
exit_code: Suggested exit code for CLI applications (1 by default)
|
||||||
|
is_retryable: Whether the error might succeed if retried
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code: int = 1
|
||||||
|
is_retryable: bool = False
|
||||||
|
|
||||||
|
def __init__(self, message: str, *args, **kwargs):
|
||||||
|
"""Initialize VLM error.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
message: Error message
|
||||||
|
*args: Additional positional arguments for Exception
|
||||||
|
**kwargs: Additional keyword arguments
|
||||||
|
"""
|
||||||
|
super().__init__(message, *args)
|
||||||
|
self.message = message
|
||||||
|
|
||||||
|
|
||||||
|
class VLMConfigError(VLMError):
|
||||||
|
"""Configuration-related errors.
|
||||||
|
|
||||||
|
Raised when configuration is invalid, missing required fields, or cannot be loaded.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- Missing library_root
|
||||||
|
- Invalid YAML syntax
|
||||||
|
- Invalid category mappings
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code = 2
|
||||||
|
is_retryable = False
|
||||||
|
|
||||||
|
|
||||||
|
class VLMFileSystemError(VLMError):
|
||||||
|
"""File system operation errors.
|
||||||
|
|
||||||
|
Raised when file operations fail (read, write, move, delete).
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- Permission denied
|
||||||
|
- File not found
|
||||||
|
- Disk full
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code = 3
|
||||||
|
is_retryable = False
|
||||||
|
|
||||||
|
|
||||||
|
class VLMIOError(VLMError):
|
||||||
|
"""I/O errors for reading/writing data files.
|
||||||
|
|
||||||
|
Raised when loading or saving inventory, identities, analysis, plans, etc.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- Invalid JSON format
|
||||||
|
- Schema version mismatch
|
||||||
|
- Missing required fields
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code = 4
|
||||||
|
is_retryable = False
|
||||||
|
|
||||||
|
|
||||||
|
class VLMTransientError(VLMError):
|
||||||
|
"""Transient errors that may succeed if retried.
|
||||||
|
|
||||||
|
Raised for temporary failures that might resolve on retry.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- Network timeouts (TMDB API)
|
||||||
|
- Temporary file locks
|
||||||
|
- Rate limiting
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code = 1 # No special exit code (will retry)
|
||||||
|
is_retryable = True
|
||||||
|
|
||||||
|
|
||||||
|
class VLMValidationError(VLMError):
|
||||||
|
"""Data validation errors.
|
||||||
|
|
||||||
|
Raised when data fails validation checks.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- Invalid filename patterns
|
||||||
|
- Invalid season/episode numbers
|
||||||
|
- Invalid quality metrics
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code = 5
|
||||||
|
is_retryable = False
|
||||||
|
|
||||||
|
|
||||||
|
class VLMQuarantineError(VLMError):
|
||||||
|
"""Quarantine operation errors.
|
||||||
|
|
||||||
|
Raised when quarantine or restore operations fail.
|
||||||
|
|
||||||
|
Examples:
|
||||||
|
- Cannot quarantine file from unsupported category
|
||||||
|
- Quarantine manifest corruption
|
||||||
|
- File already in quarantine
|
||||||
|
"""
|
||||||
|
|
||||||
|
exit_code = 6
|
||||||
|
is_retryable = False
|
||||||
Reference in New Issue
Block a user