CCA-F 练习题库· Claude Code Configuration & Workflows
一个 PreToolUse hook 脚本运行后以状态码 2 退出,并向 stderr 写了一条消息。Claude Code 会怎么做?
- A它把 exit 2 当作非阻塞警告,把 stderr 打印到 debug log,并让该工具继续运行
- B它立即结束会话
- C它把该 hook 的 stdout 解析为 JSON,据此决定允许还是拒绝该工具
- D它阻止该次工具调用,并把 hook 的 stderr 作为原因回传给 Claude
- E它会不断重试该 hook,直到其以状态码 0 退出
正确答案:D
解析
- D正确(已对照 Claude Code 官方 hooks 文档 code.claude.com/docs/en/hooks 核实):Claude Code 对 hook 退出码的解释是统一的:exit 0 表示成功(stdout 会被解析,以读取可选的决策 JSON),exit 2 表示阻塞性错误(stdout 中的 JSON 会被忽略,改用 stderr 作为消息),其他任何非零退出码都属于非阻塞错误(动作照常执行,stderr 展示给用户,并写入 debug log)。具体到 PreToolUse 事件,退出码 2 会阻止该次工具调用,并把 hook 的 stderr 作为被阻止的原因回传给 Claude。
- A错误,因为 exit 2 是阻塞性的,而不是非阻塞警告。
- C描述的是 exit 0 的路径(exit 2 时 stdout 的 JSON 会被忽略)。
- BE描述的行为并不存在。值得注意的是,退出码 1 并不会阻塞(这与 Unix 惯例不同);只有 exit 2 才会阻塞。hook 也可以换一种方式阻塞:以 exit 0 退出,并输出带 permissionDecision: "deny" 的 JSON。
延伸阅读
本题为本站自有原创练习题,非任何官方考试内容;解析对照 Anthropic 公开文档撰写, 如与最新文档不符请以官方为准。想在限时环境下检验水平,可参加 模拟考(题目与本页题库不重叠)。