🛡️ OpenClaw Agent错误处理指南

当AI遇到bug,优雅地站起来——错误处理的艺术与科学

为什么错误处理如此重要?

凌晨3点17分,你的Agent正在帮用户处理重要任务。突然,OpenAI API返回503错误。然后呢?

错误处理不是可选项,而是生产环境的生命线

🚨 统计数据:根据AWS的数据,99.95%的API服务每年至少经历4.4小时的停机时间。没有容错机制,你的Agent必然会在某个时刻挂掉。

错误类型全景图

按来源分类

错误类型 典型原因 处理策略
网络错误 连接超时、DNS失败 重试+指数退避
API限流 429 Too Many Requests 等待Retry-After
服务端错误 500/502/503 降级到备用模型
内容过滤 触发安全策略 改写prompt/换模型
上下文溢出 Token超限 压缩/分段处理
工具执行失败 工具bug/权限问题 返回错误给LLM重试

重试策略详解

指数退避重试

import { Agent, RetryPolicy } from 'openclaw';

const agent = new Agent({
  retryPolicy: RetryPolicy.exponential({
    maxRetries: 3,
    baseDelay: 1000,    // 初始延迟1秒
    maxDelay: 30000,    // 最大延迟30秒
    multiplier: 2,      // 每次延迟翻倍
    jitter: true        // 添加随机抖动防止惊群效应
  })
});

// 等效的延迟序列: 1s → 2s → 4s (带随机抖动)

可重试的错误

agent.setRetryableErrors([
  'ECONNRESET',
  'ETIMEDOUT',
  'ENOTFOUND',
  'rate_limit_exceeded',
  'server_error',
  'model_overloaded'
]);

// 对于内容过滤等错误,不应该重试
agent.setNonRetryableErrors([
  'content_policy_violation',
  'invalid_api_key',
  'context_length_exceeded'
]);

降级策略

模型级联降级

agent.setFallbackChain([
  { model: 'gpt-4-turbo', priority: 1 },
  { model: 'claude-3-5-sonnet', priority: 2 },
  { model: 'gpt-3.5-turbo', priority: 3 },
  { model: 'local-llama3', priority: 4 }
]);

// 当GPT-4失败时,自动切换到Claude
agent.on('fallback', (from, to, error) => {
  console.warn(`${from} → ${to}: ${error.message}`);
  // 可选:通知监控系统
  metrics.increment('agent.fallback', { from, to });
});

功能降级

当核心功能不可用时,降级到基础功能:

agent.on('tool_error', async (toolName, error) => {
  if (toolName === 'web_search') {
    // 搜索服务不可用,降级到使用缓存
    return await agent.useTool('cache_search');
  }
  if (toolName === 'code_execution') {
    // 代码执行不可用,只返回伪代码
    return { type: 'pseudocode', content: '代码执行服务暂时不可用' };
  }
  // 其他工具失败,返回错误让LLM处理
  return { error: error.message };
});

优雅降级用户体验

给用户明确的信息

agent.onError((error) => {
  const userMessage = {
    'rate_limit': '服务繁忙,请稍后再试',
    'content_filter': '您的内容触发了安全策略,请修改后重试',
    'context_length': '内容过长,请精简后重试',
    'default': '服务暂时不可用,请稍后再试'
  };
  
  return {
    userMessage: userMessage[error.code] || userMessage.default,
    retryable: error.retryable,
    suggestedAction: error.suggestedAction
  };
});

自动保存状态

⚠️ 重要:当Agent崩溃时,确保用户的工作状态可以恢复。OpenClaw的Session机制会自动保存对话历史。
agent.enableSessionRecovery({
  autoSave: true,
  saveInterval: 30000, // 每30秒保存一次
  onSave: (session) => {
    console.log(`Session ${session.id} saved, ${session.messages.length} messages`);
  },
  onRecover: (session) => {
    console.log(`Session ${session.id} recovered`);
    return session.lastActiveState;
  }
});

监控与告警

错误率监控

agent.setMetrics({
  errorRateThreshold: 0.05, // 错误率超过5%告警
  latencyThreshold: 10000,  // 延迟超过10秒告警
  alertChannel: 'slack',
  onAlert: (alert) => {
    console.error(`ALERT: ${alert.type} - ${alert.message}`);
  }
});

健康检查端点

// 暴露健康检查端点给负载均衡器
app.get('/health', async (req, res) => {
  const health = await agent.healthCheck();
  
  res.status(health.status === 'healthy' ? 200 : 503)
     .json({
       status: health.status,
       models: health.models,
       latency: health.latency,
       errorRate: health.errorRate
     });
});

最佳实践清单

  1. ✅ 为所有外部调用设置超时
  2. ✅ 使用指数退避重试
  3. ✅ 配置至少一个备用模型
  4. ✅ 区分可重试和不可重试的错误
  5. ✅ 给用户明确的错误信息
  6. ✅ 记录所有错误到监控系统
  7. ✅ 设置合理的告警阈值
  8. ✅ 定期演练故障恢复
✅ 生产级配置模板:OpenClaw提供agent.config.production预设,自动包含推荐的错误处理配置。

常见问题

Q: 重试次数设多少合适?

建议3次。太少可能错过临时性问题,太多会增加延迟和成本。

Q: 如何处理用户主动取消?

使用AbortController,让用户可以中断长时间运行的任务。

Q: 错误处理会增加多少开销?

几乎可忽略。重试逻辑是毫秒级的,主要开销是额外的API调用。

📅 最后更新:2026年5月2日 | 作者:妙趣AI