Files
sap-cli-skill/.claude/rules/error-handling.md
T
吴让宇 d84099d5b3 docs: 406 真因入库 + 标注过时的差距分析报告
- references/error-handling.md:新增「HTTP 406 (info 查 DDIC)」行——NW 7.40 不支持 DDIC
  专属媒体类型,且 application/xml 同样 406,只有 */* 可用(工具已内置回退,无需手工处理)。
  同步 .claude/rules/error-handling.md 副本(守卫测试强制两份一致)。
- docs/差距分析报告.md:加历史快照声明。原文(2026-06-17 / v2.1.0)的 P1 #3「info 的 Accept
  头映射缺 7 种类型」已不成立(现覆盖 18 种),且真因是回退值本身无效——留着会把人引向错方向。
  同时标注命令数 25 → 31。

699 tests OK。
2026-09-11 00:59:39 +08:00

4.4 KiB
Raw Blame History

错误处理流程

sap-cli 命令失败时的标准处理流程。严格按顺序执行。

通用流程

命令失败
  ↓
1. 诊断根因(使用方式错误 or 代码/环境问题?)
  ↓
2. 使用方式错误 → 修正参数后重试
  ↓
3. sap-cli 限制 → 报告失败,不绕过
  ↓
4. SAP 系统限制 → 穷尽自动化方案
  ↓
5. 确认无法自动化 → 请求用户 SAP GUI 操作

步骤 1:诊断根因

检查以下项目:

检查项 方法
命令参数是否正确 对照 python main.py --help 和 SKILL.md 验证参数
文件是否存在、内容是否为空 catls 检查
传输请求号是否正确 python main.py transport info --corr_nr DEVK901XXX
网络连接是否正常 python main.py config show 验证配置
对象是否存在于 SAP python main.py info --name XXX --type class

步骤 2:使用方式错误

修正后重试。常见修正:

  • 缺少 --corr_nr → 加上传输请求号
  • 对象名大小写错误 → sap-cli 会自动处理,但路径要注意
  • 文件路径错误 → 检查相对/绝对路径
  • 对象类型不匹配 → 用 python main.py --help 确认支持的类型

步骤 3sap-cli 限制

如果确认不是使用方式问题,如实报告错误信息,不要尝试绕过 sap-cli

❌ 错误做法:写 Python requests 脚本绕过
❌ 错误做法:用 curl 直接调 ADT 端点
❌ 错误做法:导入 ADTClient 调内部方法
✅ 正确做法:报告失败,说明原因

步骤 4:穷尽自动化方案(SAP 系统限制时)

遇到 SAP 系统限制时,按以下顺序穷尽自动化方案:

方案 A:调整 sap-cli 参数重试

  • 尝试不同的 --corr_nr
  • 尝试 --dry-run 预览后执行
  • 检查是否有残留锁(show-table 查看 SM12 相关信息)

方案 BABAP 报表 workaround

通过 run-program 执行辅助报表:

# 清除残留锁
python main.py sync --type report --name ZSAPILOT_CLEAR_LOCKS --path <file> --corr_nr DEVK901XXX
python main.py run-program --name ZSAPILOT_CLEAR_LOCKS

方案 Cdelete + recreate

如果对象需要完全重写:

python main.py delete --name ZMY_CLASS --type class
python main.py sync --name ZMY_CLASS --type class --path <file> --corr_nr DEVK901XXX

注意:delete 可能因传输请求绑定而失败(HTTP 423),此时需要用户在 SE09 操作。

方案 Dactivate 单独重试

python main.py activate --name ZMY_CLASS --type class --corr_nr DEVK901XXX

NW 7.40 的 double-activate 已内置在 sap-cli 中。如果 activate 仍然失败,不要再尝试其他激活策略,直接报告给用户。

步骤 5:请求用户 SAP GUI 操作

只在确认所有自动化方案穷尽后才请求用户操作。

必须一次性给出完整操作清单

当需要用户在 SAP GUI 操作时,绝不能渐进式发现问题

  • 错误:先让用户加字段 A,测试后发现缺字段 B,又让用户加字段 B
  • 正确:先做全面对比分析(show-table vs 代码中的字段引用),一次性给出完整变更清单

系统表操作的 4 步授权流程

如果需要操作系统表(唯一的例外情况):

  1. 解释原因 — 为什么需要操作系统表
  2. 列出具体操作 — 表名 + 操作类型(如 DELETE FROM SEOCLASS WHERE ...
  3. 说明风险和替代方案 — 可能的副作用、有没有不操作系统表的替代方案
  4. 等待用户确认 — 得到明确授权后才执行

常见失败场景速查

错误 常见原因 处理方式
HTTP 406 (info 查 DDIC) NW 7.40 不支持 DDIC 专属媒体类型;application/xml 同样 406,只有 */* 可用 工具已内置 */* 回退,无需手工处理
HTTP 406 (Lock DDIC) NW 7.40 不支持 DDIC 对象 ADT Lock 报告用户,SE09 处理
HTTP 403 (Locked) 残留 enqueue lock 先尝试 run-program 清锁报表,不行才 SM12
HTTP 400 (SaveFailure) 类 DEFINITION 与 SAP 不一致 检查本地 vs SAP 的 DEFINITION 差异
HTTP 423 (Transport lock) 对象绑定在传输请求中 报告用户,SE09 处理
激活失败仍 inactive NW 7.40 ADT 限制 sap-cli 已内置 double-activate,仍失败则报告用户去 SE09
WITH EMPTY KEY 运行 dump NW 7.40 不支持 修改为 WITH NON-UNIQUE KEYWITH DEFAULT KEY