错误模型¶
English | 简体中文
gseek 的失败分为类型化异常和稳定的进程退出码。库调用方应捕获
gseek.GseekError 并读取字段,而不是解析错误字符串。
1. 异常层级¶
所有已知错误继承 GseekError:
from gseek import GseekError
try:
result = gseek.align(...)
except GseekError as exc:
print(exc.code) # 稳定 code,例如 TOOL_NOT_FOUND
print(exc.message) # 人类可读描述
print(exc.context) # dict[str, str],例如 backend/path
print(exc.hint) # 可操作建议,可能为空
print(exc.exit_code) # CLI 对应退出码
| 异常 | code |
退出码 | 典型原因 |
|---|---|---|---|
GseekError |
GSEEK_ERROR(可覆盖) |
1 | 基类/未分类 |
UsageError |
USAGE_ERROR |
2 | 参数组合非法、未知 backend |
ConfigError |
CONFIG_ERROR |
2 | 环境/配置缺失 |
UnsupportedFeatureError |
UNSUPPORTED_FEATURE |
2 | 适配器不支持该输入/参数 |
ToolNotFoundError |
TOOL_NOT_FOUND |
3 | 外部工具不在 PATH/覆盖路径 |
ToolVersionError |
TOOL_VERSION_ERROR |
3 | 版本过旧或无法解析 |
ExecutionError |
EXECUTION_FAILED |
4 | 子进程非零退出/超时 |
IndexBuildError |
INDEX_BUILD_FAILED |
4 | 索引构建失败 |
IndexLockError |
INDEX_LOCK_TIMEOUT |
4 | 并发索引锁超时 |
CacheError |
CACHE_ERROR |
4 | 缓存损坏/禁用时写入 |
ManifestError |
MANIFEST_ERROR |
4 | manifest 读取/校验失败 |
ParseError |
PARSE_ERROR |
5 | 工具输出无法解析 |
InputError |
INPUT_ERROR |
5 | 输入文件/格式错误 |
DuplicateIdError |
DUPLICATE_SEQUENCE_ID |
5 | FASTA/FASTQ ID 重复 |
ReplayMismatchError |
REPLAY_MISMATCH |
6 | replay 的 result_hash 不一致 |
InputError 的子类保留自己的 code,但沿用退出码 5。
2. JSON envelope¶
GseekError.to_dict() 和 CLI 默认 stderr 都使用 gseek.error/1:
{
"schema": "gseek.error/1",
"code": "TOOL_NOT_FOUND",
"message": "required tool 'blastn' was not found",
"context": {"binary": "blastn"},
"hint": "install BLAST+ or set GSEEK_BLASTN"
}
CLI 默认输出一行 JSON;需要人类可读格式:
gseek --error-format text align ...
# gseek: --param must be KEY=VALUE, got 'bad'
# hint: ...
3. 常见处理方式¶
工具缺失¶
except ToolNotFoundError as exc:
# 先跑 gseek doctor,或设置 GSEEK_<BINARY>
raise SystemExit(f"install {exc.context.get('binary', 'the tool')}")
版本过旧¶
ToolVersionError 的 context 包含 required / found。不要静默降级;升级工具或
显式选择兼容适配器。
输入/解析错误¶
ParseError 带 path / line_number;InputError 带输入路径。不要只打印
str(exc),保留上下文便于定位。
replay 不一致¶
ReplayMismatchError 表示同一 recipe 的 canonical result_hash 不同。优先检查:
- 外部工具版本是否变化;
- 参考/输入文件哈希是否变化;
- 是否使用了不同的 index 状态;
- manifest 是否来自另一个 gseek 版本。
4. 不要做的事¶
- 不要按错误消息文本分支;用
code或异常类型。 - 不要吞掉
GseekError后返回空结果;调用方无法区分“无命中”和“失败”。 - 不要把
KeyboardInterrupt包装成GseekError;CLI 返回130。 - 不要在 CLI 自动化里解析
text错误格式;用默认 JSON。