Skip to content

错误处理

BridgeError 结构

所有 API 错误都遵循统一的错误格式:

ts
interface BridgeError {
  code: number      // 错误码
  message: string   // 错误描述
  data?: unknown    // 附加数据(可选)
}

错误码分类

错误码遵循 5 位数约定:

范围类别说明
1xxxx协议/路由Bridge 协议层面的错误
2xxxx权限/认证用户授权或认证相关
4xxxx客户端参数无效、不支持等
5xxxx内部系统内部异常

完整错误码表

ts
enum BridgeErrorCode {
  // ── 协议错误 ──
  UnhandledApi     = 10001,  // API 未注册
  InvalidRequest   = 10002,  // 请求 ID 缺失或格式错误
  ProtocolMismatch = 10003,  // 协议版本不匹配

  // ── 超时 ──
  Timeout          = 40800,  // 请求超时(等待响应)
  TimeoutAfterAck  = 40801,  // ACK 后超时(用户交互超时)

  // ── 权限/认证 ──
  PermissionDenied = 20001,  // 用户拒绝权限
  AuthFailed       = 20002,  // 认证失败(凭证无效/过期)
  BiometricCancelled = 20003, // 用户取消生物识别

  // ── 客户端错误 ──
  InvalidParam     = 40001,  // 参数缺失或无效
  NotSupported     = 40002,  // 当前环境不支持该功能
  UserCancelled    = 40003,  // 用户取消操作
  NetworkUnavailable = 40004, // 网络不可用

  // ── 内部错误 ──
  InternalError    = 50000,  // 未知内部错误
  BridgeDestroyed  = 50900,  // Bridge 已销毁
}

错误捕获

try/catch 方式

ts
import woo from 'mini-sdk'
import { BridgeErrorCode } from 'mini-sdk'

try {
  const result = await woo.getLocation()
  console.log('位置:', result)
} catch (err) {
  switch (err.code) {
    case BridgeErrorCode.PermissionDenied:
      woo.showToast({ title: '请授权位置权限', icon: 'none' })
      break
    case BridgeErrorCode.Timeout:
      woo.showToast({ title: '请求超时,请重试', icon: 'none' })
      break
    case BridgeErrorCode.NotSupported:
      woo.showToast({ title: '当前环境不支持此功能', icon: 'none' })
      break
    default:
      woo.showToast({ title: err.message, icon: 'none' })
  }
}

Callback 方式

ts
woo.getLocation({
  success(result) {
    console.log('位置:', result)
  },
  fail(err) {
    console.error(`错误 [${err.code}]: ${err.message}`)
  },
  complete() {
    console.log('调用完成')
  },
})

全局错误处理

通过 setErrorHandler 注册全局兜底处理器:

ts
import { setErrorHandler } from 'mini-sdk'

setErrorHandler((message) => {
  // 所有未被业务代码 catch 的错误都会进入这里
  console.error('[全局错误]', message)
  woo.showToast({ title: message, icon: 'none', duration: 3000 })
})

默认行为

SDK 初始化(woo.hello())时会自动注册一个默认错误处理器,将未捕获的错误以 Toast 形式展示。你可以通过 setErrorHandler 覆盖此行为。

超时机制

Bridge 有两级超时保护:

阶段默认时长说明
请求超时10s等待 Host 响应的超时时间
ACK 后超时5minHost 发送 ack 后的超时,用于用户交互操作

交互式操作(如 showDialogshowActionSheet)使用 timeout = 0,即不自动超时:

ts
// showDialog 内部实现
bridge.call('UI', 'showDialog', payload, 0)
//                                       ^ timeout = 0,等待用户点击

ACK 流程

SDK                         Host
 │ ── req ──────────────────► │
 │                            │ 收到请求,需要用户操作
 │ ◄─── ack ─────────────────│ "我收到了,正在处理"
 │                            │  ← 此时重置超时为 5min
 │   ... 用户操作中 ...       │
 │ ◄─── res ─────────────────│ 返回结果

getErrorMessage 工具函数

ts
import { getErrorMessage } from 'mini-sdk'

try {
  await woo.someApi()
} catch (err) {
  const message = getErrorMessage(err)
  // 统一转换为可读字符串
}

MiniDev Studio — 小程序开发利器