123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152 |
- import sys
- import traceback
- from typing import Callable, Any, Optional, Dict, List, Type, Union
- from functools import wraps
- import time
- class ProcessingError(Exception):
- """数据处理错误的基类"""
- def __init__(self, message: str, details: Optional[Dict[str, Any]] = None):
- self.message = message
- self.details = details or {}
- super().__init__(message)
- class DataValidationError(ProcessingError):
- """数据验证错误"""
- pass
- class ResourceNotFoundError(ProcessingError):
- """资源未找到错误"""
- pass
- class PluginError(ProcessingError):
- """插件相关错误"""
- pass
- class ConfigurationError(ProcessingError):
- """配置错误"""
- pass
- class EngineExecutionError(ProcessingError):
- """引擎执行错误"""
- pass
- class ErrorHandler:
- """错误处理器,提供统一的异常处理机制"""
-
- @staticmethod
- def handle_exceptions(func: Callable) -> Callable:
- """装饰器:用于处理函数执行期间的异常"""
- @wraps(func)
- def wrapper(*args, **kwargs):
- try:
- return func(*args, **kwargs)
- except Exception as e:
- ErrorHandler.handle_exception(e, {"function": func.__name__})
- raise
- return wrapper
- @staticmethod
- def handle_exception(exc: Exception, context: Optional[Dict[str, Any]] = None) -> None:
- """处理异常,记录日志并提供上下文信息"""
- context = context or {}
-
- # 获取异常的堆栈跟踪
- exc_type, exc_value, exc_traceback = sys.exc_info()
- stack_trace = traceback.format_exception(exc_type, exc_value, exc_traceback)
-
- # 打印异常信息
- error_message = f"异常: {type(exc).__name__}: {str(exc)}"
- print(error_message)
-
- # 打印上下文信息
- if context:
- print(f"上下文信息: {context}")
-
- # 打印堆栈跟踪
- print("堆栈跟踪:\n" + "".join(stack_trace))
-
- @staticmethod
- def retry(max_attempts: int = 3, delay: float = 1.0, backoff: float = 2.0,
- exceptions: Union[Type[Exception], List[Type[Exception]]] = Exception):
- """重试装饰器,用于自动重试可能失败的操作
-
- Args:
- max_attempts: 最大尝试次数
- delay: 初始延迟时间(秒)
- backoff: 延迟时间的增长因子
- exceptions: 需要捕获的异常类型
- """
- def decorator(func):
- @wraps(func)
- def wrapper(*args, **kwargs):
- attempt = 1
- current_delay = delay
-
- while attempt <= max_attempts:
- try:
- return func(*args, **kwargs)
- except exceptions as e:
- if attempt == max_attempts:
- print(f"重试{max_attempts}次后失败: {func.__name__}")
- raise
-
- print(f"尝试 {attempt}/{max_attempts} 失败: {func.__name__}, 错误: {e}")
- print(f"将在 {current_delay:.2f} 秒后重试...")
-
- time.sleep(current_delay)
- attempt += 1
- current_delay *= backoff
-
- return wrapper
- return decorator
-
- @staticmethod
- def validate_input(validator: Callable[[Any], bool], error_message: str = "输入验证失败"):
- """输入验证装饰器,用于验证函数输入参数
-
- Args:
- validator: 验证函数,接收函数的所有参数并返回布尔值
- error_message: 验证失败时的错误消息
- """
- def decorator(func):
- @wraps(func)
- def wrapper(*args, **kwargs):
- if not validator(*args, **kwargs):
- raise DataValidationError(error_message)
- return func(*args, **kwargs)
- return wrapper
- return decorator
-
- @staticmethod
- def measure_performance(func):
- """性能测量装饰器,用于记录函数执行时间"""
- @wraps(func)
- def wrapper(*args, **kwargs):
- start_time = time.time()
- result = func(*args, **kwargs)
- end_time = time.time()
- execution_time = end_time - start_time
- print(f"函数 {func.__name__} 执行时间: {execution_time:.4f} 秒")
- return result
- return wrapper
-
- @staticmethod
- def safe_execute(fallback_value: Any = None, log_exception: bool = True):
- """安全执行装饰器,捕获异常并返回默认值
-
- Args:
- fallback_value: 发生异常时返回的默认值
- log_exception: 是否记录异常信息
- """
- def decorator(func):
- @wraps(func)
- def wrapper(*args, **kwargs):
- try:
- return func(*args, **kwargs)
- except Exception as e:
- if log_exception:
- print(f"函数 {func.__name__} 执行失败: {e}")
- return fallback_value
- return wrapper
- return decorator
|