Skip to Content
简体中文错误处理

错误处理

了解如何正确处理API错误,构建健壮的应用程序。

HTTP状态码

所有API端点使用标准HTTP状态码表示请求结果。

状态码含义常见原因解决方案
200成功请求成功处理-
201已创建资源创建成功-
400请求错误参数格式错误、必需参数缺失、参数值无效检查请求参数格式和必需字段
401未授权API密钥无效、缺失或已过期检查Authorization头中的API密钥
403禁止访问配额不足、权限不足、模型访问受限检查账户配额、权限和模型可用性
404资源不存在端点不存在、模型不存在、任务ID无效验证请求URL、模型名称和资源ID
429请求过于频繁超过速率限制实现指数退避重试,降低请求频率
500服务器内部错误服务器临时故障稍后重试,持续失败请联系支持
502网关错误上游服务暂时不可用稍后重试
503服务不可用服务维护或过载稍后重试

错误响应格式

所有错误响应都遵循统一的JSON格式:

{ "code": "error_code", "message": "人类可读的错误描述", "data": null }

字段说明

字段类型说明
codestring机器可读的错误代码,用于程序化处理
messagestring人类可读的错误描述,可直接显示给用户
dataany附加错误信息(通常为null)

常见错误类型

1. 配额不足 (403)

错误响应:

{ "code": "quota_not_enough", "message": "user quota is not enough", "data": null }

原因:

  • 账户余额不足
  • 免费额度已用完
  • 超出套餐限制

解决方案:

  1. 登录控制台 查看余额
  2. 充值账户或升级套餐
  3. 检查是否有未支付的账单

2. 无效的API密钥 (401)

错误响应:

{ "code": "invalid_api_key", "message": "Invalid API key provided", "data": null }

原因:

  • API密钥格式错误
  • API密钥已被删除或禁用
  • Authorization头格式不正确

解决方案:

# ✅ 正确格式 Authorization: Bearer sk-1234567890abcdef # ❌ 错误格式 Authorization: sk-1234567890abcdef # 缺少 "Bearer" 前缀 Authorization: Bearer sk-1234567890abcdef # 密钥后有空格

3. 模型不存在 (404)

错误响应:

{ "code": "model_not_found", "message": "model 'invalid-model-name' not found", "data": null }

原因:

  • 模型名称拼写错误
  • 模型已下线或不再支持
  • 您的账户无权访问该模型

解决方案:

  1. 查看可用模型列表获取正确的模型名称
  2. 使用 /v1/models 端点获取当前可用模型
curl https://aiapi.services/v1/models \ -H "Authorization: Bearer YOUR_API_KEY"

4. 请求参数错误 (400)

错误响应示例:

{ "code": "invalid_request_error", "message": "Invalid parameter: max_tokens must be a positive integer", "data": null }

常见参数错误:

错误原因修复
max_tokens must be positivemax_tokens ≤ 0使用正整数 (如: 100, 1000)
temperature out of rangetemperature不在[0, 2]范围设置为 0.0 ~ 2.0 之间
invalid message formatmessages格式不正确检查是否为数组,每项包含role和content
model is required缺少model参数添加model字段

示例修复:

// ❌ 错误 { "model": "gemini-2.5-flash", "messages": "Hello" // 应该是数组 } // ✅ 正确 { "model": "gemini-2.5-flash", "messages": [ { "role": "user", "content": "Hello" } ] }

5. 速率限制 (429)

错误响应:

{ "code": "rate_limit_exceeded", "message": "Rate limit exceeded. Please try again later.", "data": { "retry_after": 60 } }

响应头:

X-RateLimit-Limit-Requests: 60 X-RateLimit-Remaining-Requests: 0 X-RateLimit-Reset-Requests: 1640995200 Retry-After: 60

解决方案: 参见速率限制文档了解详情和最佳实践。


6. 任务未找到 (404)

错误响应:

{ "code": "task_not_found", "message": "Task with id 'abc123' not found", "data": null }

原因:

  • 任务ID不存在
  • 任务已过期被清理
  • 任务ID格式错误

解决方案:

  • 检查任务ID是否正确
  • 确认任务创建成功并获取了正确的task_id
  • 异步任务通常有7天有效期

7. 内容过滤 (400)

错误响应:

{ "code": "content_filtered", "message": "Your request was rejected due to content policy", "data": { "reason": "inappropriate_content" } }

原因:

  • 输入内容违反使用政策
  • 生成内容触发安全过滤器

解决方案:

  • 修改输入内容,避免敏感或不当内容
  • 查看使用政策了解限制

错误处理最佳实践

1. 实现重试逻辑

import time import requests from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def create_session_with_retries(): """创建带自动重试的session""" session = requests.Session() retry_strategy = Retry( total=3, # 最多重试3次 backoff_factor=1, # 指数退避: 1s, 2s, 4s status_forcelist=[429, 500, 502, 503, 504], allowed_methods=["POST", "GET"] ) adapter = HTTPAdapter(max_retries=retry_strategy) session.mount("https://", adapter) session.mount("http://", adapter) return session # 使用示例 session = create_session_with_retries() response = session.post( 'https://aiapi.services/v1/chat/completions', headers={'Authorization': 'Bearer YOUR_API_KEY'}, json={'model': 'gemini-2.5-flash', 'messages': [...]} )

2. 优雅的错误处理

def call_api_safely(prompt): """安全调用API并处理所有错误""" try: response = requests.post( 'https://aiapi.services/v1/chat/completions', headers={'Authorization': f'Bearer {API_KEY}'}, json={ 'model': 'gemini-2.5-flash', 'messages': [{'role': 'user', 'content': prompt}] }, timeout=30 # 设置超时 ) # 检查HTTP状态 response.raise_for_status() # 解析响应 data = response.json() return data['choices'][0]['message']['content'] except requests.exceptions.Timeout: print("❌ 请求超时,请稍后重试") return None except requests.exceptions.HTTPError as e: # 解析错误响应 try: error_data = e.response.json() error_code = error_data.get('code', 'unknown') error_message = error_data.get('message', str(e)) except: error_code = 'unknown' error_message = str(e) # 根据错误类型处理 if e.response.status_code == 401: print(f"❌ API密钥无效: {error_message}") elif e.response.status_code == 403: print(f"❌ 配额不足: {error_message}") elif e.response.status_code == 429: print(f"❌ 请求过于频繁: {error_message}") elif e.response.status_code == 404: print(f"❌ 资源不存在: {error_message}") else: print(f"❌ API错误 [{error_code}]: {error_message}") return None except requests.exceptions.ConnectionError: print("❌ 网络连接失败,请检查网络") return None except Exception as e: print(f"❌ 未知错误: {str(e)}") return None

3. 监控和日志记录

import logging from datetime import datetime logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) def call_api_with_logging(prompt): """带日志记录的API调用""" start_time = datetime.now() try: response = requests.post( 'https://aiapi.services/v1/chat/completions', headers={'Authorization': f'Bearer {API_KEY}'}, json={ 'model': 'gemini-2.5-flash', 'messages': [{'role': 'user', 'content': prompt}] } ) duration = (datetime.now() - start_time).total_seconds() # 记录成功请求 logger.info({ 'event': 'api_call_success', 'model': 'gemini-2.5-flash', 'duration_seconds': duration, 'status_code': response.status_code, 'tokens_used': response.json().get('usage', {}).get('total_tokens', 0) }) return response.json() except Exception as e: duration = (datetime.now() - start_time).total_seconds() # 记录失败请求 logger.error({ 'event': 'api_call_failure', 'error': str(e), 'duration_seconds': duration, 'prompt_length': len(prompt) }) raise

错误排查清单

遇到错误时,请按以下清单逐项检查:

  • API密钥正确: 检查密钥格式、前缀和有效性
  • 端点URL正确: 确认使用正确的基础URL和路径
  • 请求格式正确: 验证JSON格式、必需参数和参数类型
  • 模型名称正确: 查看可用模型确认模型名称
  • 配额充足: 检查账户余额和可用配额
  • 速率限制: 确认未超过速率限制
  • 网络连接: 确保网络畅通,无防火墙阻拦
  • 超时设置: 设置合理的超时时间(建议30-60秒)

获取帮助

如果按照上述指南仍无法解决问题:

  1. 查看常见问题
  2. 查看API状态页面 
  3. 联系技术支持

💡 提示: 联系支持时,请提供完整的错误响应、请求示例(脱敏后)和时间戳,以便我们更快帮您解决问题。

Last updated on