Files
ALwrity/lib/content_scheduler/utils/error_handling.py

134 lines
4.1 KiB
Python

from typing import Optional, Dict, Any
import logging
from functools import wraps
import traceback
logger = logging.getLogger('content_scheduler')
class SchedulingError(Exception):
"""Exception raised for errors in content scheduling."""
def __init__(self, message: str):
"""Initialize the error with a message.
Args:
message: Error message
"""
self.message = message
super().__init__(self.message)
class JobExecutionError(SchedulingError):
"""Exception for job execution errors."""
pass
class ScheduleValidationError(SchedulingError):
"""Exception for schedule validation errors."""
pass
class PlatformError(SchedulingError):
"""Exception for platform-specific errors."""
pass
class DatabaseError(SchedulingError):
"""Exception for database-related errors."""
pass
def handle_scheduler_error(func):
"""Decorator for handling scheduler errors."""
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except SchedulingError as e:
logger.error(f"Scheduling error in {func.__name__}: {str(e)}")
raise
except Exception as e:
logger.error(f"Unexpected error in {func.__name__}: {str(e)}")
logger.error(traceback.format_exc())
raise SchedulingError(
f"Unexpected error in {func.__name__}: {str(e)}",
{'traceback': traceback.format_exc()}
)
return wrapper
def handle_job_error(func):
"""Decorator for handling job execution errors."""
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
logger.error(f"Job execution error in {func.__name__}: {str(e)}")
logger.error(traceback.format_exc())
raise JobExecutionError(
f"Job execution failed: {str(e)}",
{
'function': func.__name__,
'traceback': traceback.format_exc()
}
)
return wrapper
def handle_platform_error(func):
"""Decorator for handling platform-specific errors."""
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
logger.error(f"Platform error in {func.__name__}: {str(e)}")
logger.error(traceback.format_exc())
raise PlatformError(
f"Platform operation failed: {str(e)}",
{
'function': func.__name__,
'traceback': traceback.format_exc()
}
)
return wrapper
def handle_database_error(func):
"""Decorator for handling database errors."""
@wraps(func)
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
logger.error(f"Database error in {func.__name__}: {str(e)}")
logger.error(traceback.format_exc())
raise DatabaseError(
f"Database operation failed: {str(e)}",
{
'function': func.__name__,
'traceback': traceback.format_exc()
}
)
return wrapper
def format_error(error: Exception) -> Dict[str, Any]:
"""Format error for logging and reporting."""
if isinstance(error, SchedulingError):
return {
'type': error.__class__.__name__,
'message': str(error),
'details': error.details
}
else:
return {
'type': 'UnexpectedError',
'message': str(error),
'details': {
'traceback': traceback.format_exc()
}
}
def log_error(error: Exception, context: Optional[Dict[str, Any]] = None):
"""Log error with context."""
error_data = format_error(error)
if context:
error_data['context'] = context
logger.error(
f"Error: {error_data['type']} - {error_data['message']}",
extra={'error_data': error_data}
)