Skip to content

错误、重试与限流 ​

错误信封 ​

所有库内错误继承 WeiboSDKError:

ts
class WeiboSDKError extends Error {
  code: string
  level: 'transport' | 'protocol' | 'business' | 'storage'
  retryable: boolean
  context?: Record<string, unknown>
}

判断 error.code;message 会随上游文案变化。context 用于排障,包含端点、参数和截断后的响应片段。

常用错误码 ​

codelevel可重试含义
AUTH_SESSION_EXPIREDbusiness否Cookie 缺失或过期;访客下表示该能力需要登录
RATE_LIMITEDtransport是HTTP 432 / 429
NET_TIMEOUTtransport是请求超时
NET_REQUEST_FAILEDtransport是DNS、连接失败或非 2xx
API_NOT_OKbusiness否微博返回 ok !== 1
API_BAD_RESPONSEprotocol否非 JSON(登录页 / 风控页)或 schema 不匹配
CONFIG_INVALIDbusiness否Cookie、代理或参数不合法
MEDIA_*transport / protocol / storage视情况媒体下载失败

完整列表与排查步骤见 故障排查。

重试策略 ​

默认只重试可重试的结构化错误:

ts
new WeiboSDK({
  retry: {
    retries: 2,
    baseDelayMs: 500,
    maxDelayMs: 8000,
    retryOn: ['rate_limit', 'server_error', 'timeout', 'network_error'],
  },
})
  • retries 默认 2,上限 10;retryOn: [] 表示不重试。
  • 4xx、ok !== 1、schema 校验失败直接返回错误。
  • 432 / 429 会解析 Retry-After,并暂停全局令牌桶(含并发请求)。
  • 媒体下载有独立重试参数,见 下载媒体。

分类处理示例 ​

ts
try {
  await sdk.tweets.getByMblogId(id)
}
catch (error) {
  if (!(error instanceof WeiboSDKError)) throw error

  switch (error.code) {
    case 'AUTH_SESSION_EXPIRED':
      // 重新导出 Cookie;访客模式下检查 context.requiredAuth
      break
    case 'RATE_LIMITED':
      // 交给 SDK 退避
      break
    case 'NET_TIMEOUT':
    case 'NET_REQUEST_FAILED':
      // 可以重试
      break
    case 'API_BAD_RESPONSE':
      // 上游结构漂移:记录 context.endpoint / context.zodIssues
      break
    default:
      break
  }
}

CLI 错误输出 ​

CLI 把错误写到 stderr,以非零退出码结束,stdout 只保留命令结果:

json
{"code":"AUTH_SESSION_EXPIRED","level":"business","retryable":false,"message":"...","context":{}}

只读公开数据;请遵守微博服务条款与隐私边界。