134 lines
4.1 KiB
Python
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}
|
|
) |