ITADN

[OCR] Phase 2-4: 错误处理和异常恢复机制

#2370Closedmessere1 创建于 2026-01-01
M
messere1commented
## 实现进度 ### ✅ 已完成部分 #### 1. 自定义异常类体系 (100%) - [x] 创建 `core/exceptions.py` 包含以下异常类: - `OCRException`: 基础异常类,包含 `error_code`、`message`、`details` 字段 - `ImageProcessingError`: 图像处理失败 - `ModelInferenceError`: 模型推理失败 - `ValidationError`: 输入验证失败 - `ModelLoadingError`: 模型/处理器加载失败 - `ConfigurationError`: 配置错误 - `ResourceNotFoundError`: 资源未找到 - `TimeoutError`: 超时错误 - `BatchProcessingError`: 批处理失败 - [x] 所有异常类都实现 `to_dict()` 方法用于 API 序列化 - [x] 所有异常类都实现 `__str__()` 方法用于日志记录 #### 2. ImageProcessor 异常处理 (100%) - [x] `process()` 方法:全面异常处理 - 捕获 `ValueError` 转为 `ValidationError` - 捕获通用异常转为 `ImageProcessingError` - 添加 `exc_info=True` 用于详细日志 - [x] `_load_image()` 方法:详细输入验证 - 空数据检查 - 文件路径验证 - numpy 数组形状验证 - PIL Image 大小验证 - 图像格式转换错误处理 #### 3. VLMOCREngine 异常处理 (100%) - [x] `predict()` 方法: - 输入验证异常处理 - 图像加载错误处理 - Prompt 构建错误处理 - 图像编码错误处理 - 模型推理错误处理 - 结果解析错误处理 - 输出格式化错误处理 - [x] `predict_batch()` 方法: - 批量验证(空批次检查) - 单个图像失败继续处理其他图像 - 追踪失败统计信息 - 所有图像失败时抛出 `BatchProcessingError` - 部分失败时记录警告但返回结果 - [x] `predict_from_url()` 方法: - URL 格式验证 - 下载失败抛出 `ResourceNotFoundError` - 处理过程异常捕获 #### 4. Qwen2VL 模型异常处理 (100%) - [x] `load_model()` 方法: - 处理 `ImportError` (缺少依赖) - 处理 `OSError` (模型文件未找到) - 处理 `RuntimeError` (运行时错误) - 所有错误转为 `ModelLoadingError` 并提供详细信息 - [x] `load_processor()` 方法: - 本地加载失败后尝试在线加载 - 两者都失败时抛出 `ModelLoadingError` - 提供详细的错误上下文 - [x] `load_tokenizer()` 方法: - 本地/在线加载回退机制 - 详细的错误信息 #### 5. API 路由异常处理 (100%) - [x] `app.py` lifespan 启动: - 捕获 `ModelLoadingError` 并记录详细信息 - 启动失败时抛出 `RuntimeError` - [x] `predict_image()` 路由: - `ValidationError` → HTTP 400 (Bad Request) - `ImageProcessingError` → HTTP 422 (Unprocessable Entity) - `ModelInferenceError` → HTTP 500 (Internal Server Error) - 返回结构化错误响应 - [x] `predict_batch()` 路由: - 验证空文件列表 - 单个图像失败不影响其他图像 - 返回混合成功/失败结果 #### 6. 测试更新 (100%) - [x] 更新 `test_preprocessing.py` 使用新的异常类型 - [x] `test_invalid_input`: 期望 `ValidationError` - [x] `test_empty_image`: 期望 `ValidationError` - [x] 所有 67 个测试通过 ### 📊 实现统计 | 组件 | 状态 | 完成度 | |------|------|--------| | 异常类体系 | ✅ 完成 | 100% | | ImageProcessor | ✅ 完成 | 100% | | VLMOCREngine | ✅ 完成 | 100% | | Qwen2VL 模型 | ✅ 完成 | 100% | | API 路由 | ✅ 完成 | 100% | | 测试覆盖 | ✅ 完成 | 100% | ### 🚀 提交信息 **Commit**: bca63d43 **Branch**: feature/issue-2350-preprocessing-phase1 **Files Changed**: 7 files (919 insertions, 155 deletions) **Tests**: 67/67 passing ✅ ### 📝 代码变更概览 1. **新增文件**: - `src/mindnlp/ocr/core/exceptions.py` (315 lines) - 完整的异常类体系 2. **修改文件**: - `src/mindnlp/ocr/core/processor/image.py` - 增强 ImageProcessor 异常处理 - `src/mindnlp/ocr/core/engine.py` - VLMOCREngine 全面异常处理 - `src/mindnlp/ocr/models/qwen2vl.py` - Qwen2VL 加载异常处理 - `src/mindnlp/ocr/api/app.py` - 启动异常处理 - `src/mindnlp/ocr/api/routes/ocr.py` - API 路由异常映射 - `tests/mindnlp/ocr/test_preprocessing.py` - 测试适配新异常类型 ### 🎯 实现亮点 1. **层次化异常处理**: - 底层模块(ImageProcessor, Qwen2VL)抛出具体异常 - 中层模块(VLMOCREngine)捕获并包装异常 - API 层将异常映射为 HTTP 状态码 2. **详细的错误信息**: - 所有异常都包含 `error_code`、`message`、`details` - 使用 `exc_info=True` 记录完整堆栈跟踪 - `to_dict()` 方法支持 API 序列化 3. **优雅降级**: - 批处理支持部分失败继续执行 - 本地加载失败自动回退到在线加载 - 提供有意义的错误消息和恢复建议 4. **完整的测试覆盖**: - 所有测试适配新的异常类型 - 验证异常传播链路正常工作 - 100% 测试通过率 ### ✅ 任务完成度 根据 issue #2370 的要求: 1. ✅ **设计异常处理策略** - 完成层次化异常体系设计 2. ✅ **实现自定义异常类** - 创建 9 个异常类并实现序列化 3. ✅ **完善错误响应机制** - API 返回结构化错误响应 4. ✅ **增加错误日志和监控** - 所有关键点添加日志并使用 exc_info ### 🔄 后续可能的增强 虽然核心功能已完成,但未来可以考虑: 1. **错误监控集成**: 集成 Sentry/Prometheus 进行错误追踪 2. **重试机制**: 为临时性错误(如网络问题)添加自动重试 3. **错误统计**: 收集错误频率和类型分布数据 4. **用户友好错误**: 为终端用户提供更易懂的错误描述 ### 📚 相关 Commit - e8ad210a - Issue #2366 (OCR 功能) - 9145e378 - Issue #2367 (图像预处理) - 75ace97e - Issue #2368 (输出格式化) - **bca63d43** - Issue #2370 (错误处理) ← 本次提交
关闭于 2026-01-02 0 条评论