Files
sap-cli-skill/references/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

123 lines
4.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 错误处理流程
sap-cli 命令失败时的标准处理流程。严格按顺序执行。
## 通用流程
```
命令失败
1. 诊断根因(使用方式错误 or 代码/环境问题?)
2. 使用方式错误 → 修正参数后重试
3. sap-cli 限制 → 报告失败,不绕过
4. SAP 系统限制 → 穷尽自动化方案
5. 确认无法自动化 → 请求用户 SAP GUI 操作
```
## 步骤 1:诊断根因
检查以下项目:
| 检查项 | 方法 |
|--------|------|
| 命令参数是否正确 | 对照 `python main.py --help` 和 SKILL.md 验证参数 |
| 文件是否存在、内容是否为空 | `cat``ls` 检查 |
| 传输请求号是否正确 | `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` 执行辅助报表:
```bash
# 清除残留锁
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
如果对象需要完全重写:
```bash
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 单独重试
```bash
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 KEY``WITH DEFAULT KEY` |