第十章:常见问题与避坑

本章整理了使用 Claude 和 Claude Code 过程中最常见的问题及解决方案,帮助你快速排查问题、规避已知坑点。

10.1 上下文超限怎么办

症状识别

  • Claude 开始"遗忘"对话早期设定的规则
  • 回答与之前提供的文件内容不一致
  • /status 显示 token 使用量超过 80%
  • 响应速度明显变慢

解决方案(按情况选择)

情况方案
任务还没完成,需要继续 使用 /compact 压缩上下文,可指定保留重点
已完成阶段性任务,准备新阶段 使用 /clear 清空,重新描述当前状态
处理超大文件(>5万行) 拆分任务,每次只引用相关的文件片段

预防措施

text
# 定期主动压缩,不等 Claude 遗忘才处理
# 在完成每个子任务后执行:
/compact 保留:已修改的文件列表、下一步计划、当前约定的代码规范

10.2 Claude 拒绝执行某些操作

常见拒绝原因

拒绝类型原因解决方式
安全策略拒绝 请求涉及潜在有害内容 调整描述方式,说明合法用途背景
权限设置拒绝 settings.json deny 规则命中 检查并修改 permissions 配置
谨慎性拒绝 操作风险较高(如删除文件),需要确认 明确确认意图,或在 allow 中添加该操作
能力边界拒绝 超出 Claude 的知识或能力范围 分解任务,提供更多上下文

改写技巧

text
# 被拒绝的写法
生成一个绕过登录验证的脚本

# 合理的改写(说明合法背景)
我是这个系统的开发者,正在进行渗透测试。
请帮我分析 src/auth/middleware.ts 中的登录验证逻辑,
找出可能存在的安全漏洞,以便我修复它们。
💡
关键原则

Claude 的拒绝通常是为了保护用户。不要尝试绕过安全限制,而是换一个更清晰描述合法目的的方式重新表述需求。

10.3 权限报错排查

常见错误及原因

text
Error: Tool 'Bash' is not allowed
→ 原因:settings.json 中没有允许 Bash 工具,或 deny 规则命中
→ 修复:在 permissions.allow 中添加 "Bash(your-command *)"

Error: Write permission denied for path '/etc/...'
→ 原因:目标路径不在 Write 权限的允许范围内
→ 修复:检查 permissions.allow 中的 Write 路径规则

Error: ANTHROPIC_API_KEY is not set
→ 原因:环境变量未配置
→ 修复:export ANTHROPIC_API_KEY="sk-ant-..."

Error: 401 Unauthorized
→ 原因:API Key 无效或已过期
→ 修复:在 Anthropic Console 重新生成 Key

权限配置调试步骤

运行 /doctor 诊断

Claude Code 内置诊断命令,可自动检查常见配置问题。

检查 settings.json 语法
bash
cat .claude/settings.json | python3 -m json.tool
确认权限规则生效

在 REPL 中尝试具体操作,观察是否提示权限问题,根据提示的工具名称检查对应规则。

10.4 输出质量不稳定

常见问题与对策

问题现象原因对策
每次输出格式不一致 未指定输出格式 在 Prompt 末尾明确说明输出格式要求
代码风格与项目不符 CLAUDE.md 中规范不够具体 在 CLAUDE.md 中添加具体的代码风格示例
同一任务结果差异大 temperature 过高 API 调用时将 temperature 设为 0
忽略之前的约定 上下文过长,早期内容被遗忘 定期 /compact,重要约定写入 CLAUDE.md
产出过于保守/模板化 缺乏具体背景信息 提供更多上下文,包含具体例子和期望风格

提升稳定性的系统提示技巧

text
# 在 CLAUDE.md 中固化输出规范
## 输出规范(每次都必须遵守)
- 代码统一使用 TypeScript,严格模式
- 函数命名用 camelCase,类命名用 PascalCase
- 每个函数不超过 30 行,超出则拆分
- 不添加我没有要求的功能(YAGNI 原则)
- 修改现有代码前,先说明修改理由

10.5 API 限流与重试策略

常见限流错误

错误码含义处理方式
429 rate_limit_error请求频率超限指数退避重试
529 overloaded_error服务器过载等待后重试,可切换模型
413 request_too_large请求体过大减少输入内容,启用 Prompt Caching

生产级重试实现

python
import anthropic
import time

client = anthropic.Anthropic(
    max_retries=3,  # SDK 内置重试
    timeout=60.0,
)

def call_with_backoff(messages, max_attempts=5):
    """手动指数退避,用于需要更精细控制的场景"""
    for attempt in range(max_attempts):
        try:
            return client.messages.create(
                model="claude-sonnet-4-6",
                max_tokens=1024,
                messages=messages,
            )
        except anthropic.RateLimitError:
            if attempt == max_attempts - 1:
                raise
            wait = (2 ** attempt) + 0.5  # 1.5s, 2.5s, 4.5s, 8.5s
            print(f"限流,{wait}s 后重试...")
            time.sleep(wait)
        except anthropic.APIStatusError as e:
            if e.status_code == 529:  # 服务器过载
                time.sleep(5)
                continue
            raise

10.6 成本控制技巧

费用构成理解

Anthropic API 按 token 计费:输入 token 和输出 token 分开计价,输入通常低于输出。主要成本来源:长系统提示、大文件引用、长对话历史。

降本策略清单

策略预计节省适用场景
使用 Haiku 处理简单任务90%+分类、摘要、格式转换
启用 Prompt Caching输入降低 90%多轮问答同一长文档
精简系统提示10-30%所有场景
减少 max_tokens按比例知道输出不会很长时
用 /compact 压缩历史50-70%长会话
批处理相似任务减少调用次数批量处理场景

监控用量

text
# 在 Claude Code REPL 中随时查看当前会话费用
/cost

# API 响应中查看精确用量
response.usage.input_tokens   # 输入 token 数
response.usage.output_tokens  # 输出 token 数
response.usage.cache_read_input_tokens   # 缓存命中数(不计费)
response.usage.cache_creation_input_tokens  # 缓存写入数

10.7 安全注意事项

API Key 安全

  • 绝对不要将 API Key 提交到 Git 仓库(包括私有仓库)
  • 使用环境变量或密钥管理服务(AWS Secrets Manager、HashiCorp Vault)
  • 为不同环境(开发/生产)使用不同的 API Key
  • 定期轮换 API Key,发现泄露立即在 Console 撤销
bash
# 检查是否不小心提交了 Key
git log --all --full-history -- **/*.env
git grep -r "sk-ant-" --cached

# 如果已提交,立即撤销并用 git-filter-repo 清理历史
pip install git-filter-repo
git filter-repo --replace-text <(echo "sk-ant-XXXX==>REMOVED")

在 Claude Code 中处理敏感数据

🔴
不要将以下内容粘贴给 Claude

生产数据库的真实用户数据、未脱敏的 PII(姓名/身份证/银行卡)、其他服务的 API Key 或密码、企业内部的保密文件。

权限最小化原则

json
{
  "permissions": {
    "allow": [
      "Read(src/**)",
      "Read(tests/**)",
      "Write(src/**)",
      "Bash(npm test)",
      "Bash(npm run lint)",
      "Bash(git status)",
      "Bash(git diff *)"
    ],
    "deny": [
      "Bash(git push *)",
      "Bash(npm publish *)",
      "Bash(rm *)",
      "Write(.env*)",
      "Write(*.key)",
      "Write(*.pem)"
    ]
  }
}

Headless 模式安全清单

  • CI/CD 环境中通过 Secrets 注入 API Key,不要硬编码
  • 使用 --dangerously-skip-permissions 时必须有严格的 deny 规则
  • 审计 Claude 在 CI 中执行的所有命令(通过 Hooks 记录日志)
  • 隔离 CI 环境权限,确保 Claude 无法访问生产系统
🎉
恭喜完成全部章节!

你已经系统学习了 Claude 从基础到高级的完整知识体系。建议从第九章选一个实战案例动手实践,巩固所学内容。如果遇到新问题,欢迎回到对应章节查阅,或在 GitHub Issues 中搜索社区解答。