fix: 封面模板 API 错误处理加固,表不存在时降级返回空列表 #1329
Reference in New Issue
Block a user
Delete Branch "fix/cover-templates-error-handling"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
背景
封面模板功能(PR #1323)已合入 develop,但 staging 环境数据库迁移 055_cover_templates 未执行,cover_templates 表不存在,导致 GET /api/v1/cover-templates 返回 500。
改动
OperationalError/ProgrammingError,降级返回{"items": [], "total": 0}+ warning 日志交付标准
注意:本 PR 不直接执行 staging 数据库迁移,迁移会在 CI 部署时自动执行(
alembic upgrade head)。🚀 预览环境已部署
【阻塞级判定】
📊 审查概览
🔴 阻塞级问题(必须修复)
[apps/api/app/api/routes/cover_templates.py: 36-47] 列表接口错误处理逻辑不一致
list_cover_templates接口在捕获到数据库异常时返回了 HTTP 200 状态码(通过返回 Response 对象隐式实现)和空列表,而create、update、delete接口在相同情况下返回了 HTTP 503 状态码。这种不一致性会导致前端无法正确判断服务状态(误以为无数据而非服务不可用),同时掩盖了数据库故障,不利于监控和运维。list_cover_templates应与其他接口保持一致,在捕获到OperationalError或ProgrammingError时抛出 HTTPException(status_code=503),或者至少返回一个明确的错误状态码,而不是伪装成成功的空数据响应。[apps/api/app/api/routes/cover_templates.py: 102-111, 140-149] 更新与删除接口异常捕获范围不足
update_cover_template和delete_cover_template中,try-except块仅包裹了repo.get(template_id)。如果repo.get成功(表存在),但后续的repo.update或repo.delete操作因数据库连接断开、死锁等抛出OperationalError,这些异常将不会被捕获,导致接口返回 500 错误。这违背了 PR 描述中“数据库表不可用时降级处理”的初衷,且与create接口(包裹了整个写操作)的行为不一致。try-except块的范围扩大,覆盖所有可能产生数据库交互的代码(包括repo.update和repo.delete),确保在数据库不可用时能统一返回 503。💡 改进建议(不阻塞合并)
try-except (OperationalError, ProgrammingError)逻辑。建议将此异常处理逻辑提取为 FastAPI 的dependency或装饰器,以减少代码重复并提高可维护性。✅ 良好实践
OperationalError和ProgrammingError分别编写了测试用例,验证了降级逻辑。✅ 格式检查通过 | ❌ 逻辑审查需修改 | ✅ 性能无问题
🤖 由 AI 代码审查机器人自动生成 | 2026-08-10 02:30:52 | 模型:
CI全绿,自动审批通过。
CI全绿,自动审批通过。
🗑️ 预览环境已清理
PR #1329 已关闭或合并,对应的预览环境已被清理。