跳到主要内容

15.1.7 错误处理

异常类型

SDK 将所有 API 错误统一封装为 ApiException,您可以从中获取 HTTP 状态码和服务端返回的错误消息。

import org.openapitools.client.ApiException;

try {
ElementDTO element = elementApi.apiV1ElementsIdGet("nonexistent-id");
} catch (ApiException e) {
System.err.println("HTTP 状态码:" + e.getCode());
System.err.println("错误消息:" + e.getMessage());
System.err.println("响应体:" + e.getResponseBody());
}

常见错误码

HTTP 状态码含义常见原因建议处理方式
400请求参数错误参数类型不对、必填项缺失检查请求参数
401未认证Token 缺失或已过期重新登录获取 Token
403无权限当前用户无权访问该资源检查用户角色与元素访问权限配置
404资源不存在ID 错误或资源已被删除确认资源 ID 是否正确
429请求过于频繁超出 API 限流阈值降低请求频率,加入重试等待
500服务器内部错误服务端异常稍后重试,或联系管理员

推荐的重试模式

对于 429(限流)和 5xx(服务端错误),建议使用指数退避重试:

import time
from idmp_sdk.rest import ApiException

def call_with_retry(fn, max_retries=3, base_delay=1.0):
"""
带指数退避的重试包装器。
仅对 429 和 5xx 错误重试,4xx(客户端错误)直接抛出。
"""
for attempt in range(max_retries):
try:
return fn()
except ApiException as e:
if e.status == 429 or e.status >= 500:
if attempt == max_retries - 1:
raise
wait = base_delay * (2 ** attempt) # 1s, 2s, 4s...
print(f"请求失败({e.status}),{wait}s 后重试...")
time.sleep(wait)
else:
raise # 4xx 错误直接抛出,不重试

# 使用示例
result = call_with_retry(
lambda: element_api.api_v1_elements_get(page_num=1, page_size=50)
)

调试建议

  • 收到 401 时,优先检查 Token 是否已过期,而不是检查代码逻辑。
  • 收到 400 时,打印完整的 responseBody,服务端通常会在其中说明具体哪个参数有问题。
  • 开发阶段建议开启 SDK 的 HTTP 请求日志,方便追踪原始请求和响应。