error_handlers.py 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """错误处理装饰器和工具函数"""
  2. import logging
  3. from functools import wraps
  4. from typing import Callable, Any
  5. from utils.exceptions import (
  6. LearningAgentError,
  7. DomainNotFoundError,
  8. FileReadError,
  9. FileWriteError,
  10. LLMError,
  11. )
  12. logger = logging.getLogger(__name__)
  13. def handle_errors(func: Callable) -> Callable:
  14. """
  15. 统一错误处理装饰器
  16. 捕获异常并返回友好的错误消息
  17. """
  18. @wraps(func)
  19. def wrapper(*args, **kwargs) -> Any:
  20. try:
  21. return func(*args, **kwargs)
  22. except DomainNotFoundError as e:
  23. return f"❌ 错误:{e}\n请先使用 /create 创建学习计划。"
  24. except FileReadError as e:
  25. return f"❌ {e}\n请检查文件路径和权限。"
  26. except FileWriteError as e:
  27. return f"❌ {e}\n请检查磁盘空间和权限。"
  28. except LLMError as e:
  29. return f"❌ {e}\n请稍后重试或检查配置。"
  30. except KeyboardInterrupt:
  31. return "\n\n👋 操作已取消"
  32. except LearningAgentError as e:
  33. logger.error(f"LearningAgent error in {func.__name__}: {e}")
  34. return f"❌ {e}"
  35. except Exception as e:
  36. logger.error(f"Unexpected error in {func.__name__}: {e}", exc_info=True)
  37. return f"❌ 发生未知错误:{e}\n请查看日志或联系开发者。"
  38. return wrapper