第十章:常见问题与避坑
本章整理了使用 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 中搜索社区解答。