# Errno错误码
在使用部分小程序 API / 组件时,抛出的异常(fail 回调 / Promise reject)Error
对象中除了带有 errMsg
,还会带有通用错误码 errno
。
代码示例
wx.openBluetoothAdapter({
success (res) {
console.log(res)
}
fail (err) {
console.log(err.errno)
}
})
# 背景介绍
errno
错误码的出现是为了解决以下问题:
- 目前部分 API 在出现错误时,只返回错误信息
errMsg
,没有错误码。另一部分 API 虽然有 errCode,但没有形成统一格式规范。 - 目前有 errCode 的 API 中,不同的 API 失败时返回的 errCode 粒度不同。部分 API 的 errCode 粒度太大,信息不足。
- 相同的错误在不同的 API 中 errCode 未对齐,不便于开发者记忆和处理。
因此,我们设计了一套拥有统一规范的错误码errno
,以帮助开发者更好地开发调试及处理错误。
errno
错误码有如下优点:
- 在错误码格式上,拥有统一的设计规范。
- 不同的 API 中出现的相同错误,对应的错误码一致。
- 错误码中包含 API 类别信息,帮助开发者快速定位问题。
- 不同 API 中的错误码粒度较为统一。
当 Error
对象中同时有 errno
错误码和 errCode
错误码时,一般以 errno
错误码为准。
后续 errno
错误码会逐步推广到所有 API 接口,并取代现有的 errCode
参数,为开发者提供错误信息。
# 错误码设计
errno
错误码一般为 7 位数,第 1 - 2 位标识 API 接口的一级类目,第 3 - 4 位标识 API 接口的二级类目,第 5 - 7 位表示具体的错误类型。
例如: errno
错误码为 1504003
时,15
表示 API 接口的一级类目为 设备,04
表示 API 接口的二级类目为 NFC,003
表示具体的错误类型。
目前已接入 errno
的 API 接口涉及的类目包括:
- 一级类目:
00
- 通用错误码 - 一级类目:
01
- 基础- 二级类目:
00
- 通用基础错误 - 二级类目:
03
- 更新 - 二级类目:
09
- 加密
- 二级类目:
- 一级类目:
06
- 网络- 二级类目:
00
- 通用网络错误 - 二级类目:
02
- 发起请求 - 二级类目:
03
- 下载 - 二级类目:
04
- 上传 - 二级类目:
06
- mDNS
- 二级类目:
- 一级类目:
07
- 支付- 二级类目:
00
- 通用支付错误 - 二级类目:
01
- 支付默认二级类目
- 二级类目:
- 一级类目:
11
- 媒体- 二级类目:
07
- 实时音视频
- 二级类目:
- 一级类目:
13
- 文件- 二级类目:
00
- 通用文件错误 - 二级类目:
01
- 文件默认二级类目 - 二级类目:
02
- fd接口
- 二级类目:
- 一级类目:
14
- 开放接口- 二级类目:
16
- 视频号
- 二级类目:
- 一级类目:
15
- 设备- 二级类目:
00
- 通用设备错误 - 二级类目:
04
- NFC - 二级类目:
05
- Wi-Fi - 二级类目:
09
- 低功耗蓝牙 - 二级类目:
10
- 蓝牙
- 二级类目:
- 一级类目:
20
- AI- 二级类目:
02
- 人脸识别 - 二级类目:
03
- vision kit - 二级类目:
04
- 机器学习
- 二级类目:
一级类目与二级类目名称 和 API 接口文档的类目名称基本保持一致。
# 最佳实践
以 API 接口 openBluetoothAdapter
为例,当蓝牙适配器不可用时,针对 openBluetoothAdapter
接口抛出的异常 Error
对象:
"err":
{
"errMsg": "openBluetoothAdapter:fail:not available",
"errCode": 10001,
"errno": 1500102
}
可以通过以下代码进行异常处理:
wx.openBluetoothAdapter({
success (res) {
console.log(res)
},
fail (err) {
// 微信无法使用蓝牙,可引导用户在系统设置中启用蓝牙
if ( err.errno === 1500102 ) {
wx.showModal({
content: '微信无法使用蓝牙,请到系统设置中启用'
})
}
}
})
# 错误码列表
以下是 errno
值的一览表。
errno | errMsg | 含义 |
---|---|---|
0 | ok | 成功 |
1 | cancel | 撤销 |
3 | system permission denied | 系统权限未授予微信 |
4 | internal error | 小程序框架内部异常 |
5 | time out | 接口超时 |
100 | jsapi not supported | JsApi不支持 |
101 | jsapi invalid request data | JsApi请求参数非法 |
102 | jsapi has no permission | JsApi没有权限 |
103 | jsapi user authorize denied | JsApi用户拒绝授权 |
104 | jsapi user authorize canceled | JsApi用户取消授权 |
106 | invalid jsapi index | JsApi权限位序号非法 |
108 | cgi failed for network issues | 网络错误导致CGI逻辑失败 |
109 | cgi failed for response null | CGI响应为空 |
110 | scope or scope list empty | scope或者scope列表为空 |
111 | oom occurs | 发生OutOfMemoryError |
112 | api scope is not declared in the privacy agreement | 接口未在隐私协议中声明 |
1000 | server system error | 服务端系统错误 |
1001 | invalid request parameter | 基础库wx接口请求参数非法 |
1002 | empty request | 空的请求 |
1003 | meet server frequency limit | 命中服务端频率限制 |
1004 | invalid openid | 不合法的openid |
1005 | invalid appid | 不合法的appid |
1006 | insert data failed | 添加数据失败 |
1007 | get no data | 数据不存在 |
1008 | update data failed | 更新数据失败 |
1009 | data expired | 数据过期 |
1010 | data deleted | 数据被删除 |
1011 | invalid user id | 不合法的用户身份 |
1012 | api need post method | api要求post请求 |
1013 | api need get method | api要求get请求 |
1014 | invalid user ticket | 无效的凭证 |
1015 | invalid api | 无效的接口 |
1016 | no websocket conn info | 无websocket连接信息 |
1017 | mem err | 服务端内存相关错误 |
1018 | duplicated uuid | uuid冲突 |
1019 | not friend | 不是好友关系 |
1020 | code already used | code已经使用 |
1021 | code expired | code过期 |
1022 | invalid json | json数据解析错误 |
1023 | invalid state | 无效的状态 |
1024 | invalid plugin appid | 不合法的插件appid |
1025 | wxa appid privacy api banned | 小程序隐私接口被封禁,解决方案参考链接 |
1026 | wxgame appid privacy api banned | 小游戏隐私接口被封禁,解决方案参考链接 |
100001 | json parse error | json解析错误 |
101100 | interface is not declared in the privacy agreement | 接口未在隐私协议中声明 |
101101 | privacy interface is banned | 隐私接口已封禁 |
101102 | privacy permission is not authorized | 用户未同意授权隐私协议 |
102101 | settings page not found | openSystemSettings找不到对应的系统设置页 |
103101 | applyUpdate has been called | applyUpdate已被调用 |
103102 | update is not ready | update未准备完成 |
109001 | invalid random value length | 无效的随机数长度 |
500001 | invalid style | 无效的style |
505101 | require absolute path | 需要绝对路径 |
510001 | invoke too frequently | 函数调用时间间隔过短 |
510101 | invalid text | 无效的text |
600000 | unknown network error | 未知的网络错误 |
600001 | cronet component error | cronet组件错误,详细错误参考返回中的errMsg字段。参考cronet源码net_error_list 或 net_error_list |
600002 | url not in domain list | url域名不在安全域名列表中 |
600003 | network interrupted error | 网络被迫中断。以下2种情况会导致该错误:1. 当小程序处于后台时发起网络请求;2. 小程序在前台发起网络请求后,退到后台,同时请求未能在退后台后的 5s 内结束时。 |
600004 | network logic error | 网络类目逻辑错误 |
600005 | network argv error | 网络类目参数错误 |
600006 | network system error | 网络类目系统错误 |
600007 | network exceed max task count | 超过最大请求数量 |
600008 | network reach the max redirect count | 超过最大重定向次数 |
600009 | invalid URL | URL 格式不合法 |
600010 | invalid request data | 请求的 data 序列化失败 |
600011 | url validate error | URL验证错误 |
602000 | unknown network request error | 未知的发起请求错误 |
602001 | request system error | request系统错误 |
602002 | request server http error | http请求httpdns服务商错误 |
602101 | not buy httpdns service | 小程序未在服务市场购买httpdns服务 |
602102 | service expired | 小程序在httpdns服务市场资源包过期 |
602103 | no enough httpdns quota | 小程序在httpdns服务市场额度不足 |
602104 | empty servicer return | httpdns服务商返回结果为空 |
602105 | time-out when request servicer | 调用httpdns服务商结果超时 |
602106 | invalid servicer response | httpdns服务商返回数据不合法 |
602107 | empty domain httpdns result | httpdns域名解析结果为空 |
602108 | not valid service id | 不支持的httpdns服务商id |
602300 | convert native buffer parameter fail. native buffer exceed size limit | 超出native buffer最大限制 |
602301 | bind socket dependency is unavailable | 申请移动网络请求失败 |
602302 | response data convert to UTF8 fail | 请求数据转换格式失败 |
603101 | iOS not supported | 不支持ios平台 |
603102 | android not supported | 不支持安卓平台 |
603103 | parameter error: require packageName or packageNameArray | 需要包名或包名数组 |
603104 | parameter error: require downloadId or downloadIdArray or appIdArray | 需要下载ID或者ID数组或APPID数组 |
603105 | abort download task | 中断下载任务 |
603300 | download save file error | 保存文件出错 |
603301 | exceed max file size | 超出文件最大大小限制 |
603302 | file data is empty | 文件数据为空 |
603303 | permission denied can not open file filepath | 指定存储路径无权限 |
605103 | WebSocket connect is fail | WebSocket connect失败 |
606101 | mdns resolve system error:%d | 解析失败,详细错误参考返回中的errMsg字段。系统错误码参考链接 |
700000 | unknown payment error | |
700001 | limited use | 马甲微信拦截支付接口 |
701000 | unknown payment default class error | |
701001 | ios not support | |
701002 | need realname verify before payment | |
701100 | midas buy goods failed | 米大师下单失败 |
701101 | midas get account balance failed | 米大师查询账户额度失败 |
701102 | midas currency pay failed | 米大师代币付款失败 |
701103 | midas currency canel pay failed | 米大师代币退款失败 |
701104 | midas currency present failed | 米大师赠送代币失败 |
701105 | midas get user water failed | 米大师拉取用户流水失败 |
701106 | midas currency in sufficient | 米大师代币余额不足 |
701107 | midas order not exists | 米大师订单不存在 |
701108 | midas order already refunded | 米大师订单已经退款 |
701109 | midas order refunded amount exceed | 米大师代币退款金额超过上限 |
701110 | midas order duplicated pperator | 付款重复操作 |
701111 | midas invalid parameter | 参数错误 |
701112 | midas get coupons failed | 米大师拉取代金劵失败 |
701113 | midas get set coupon order failed | 米大师下单时记录代金券信息失败 |
701114 | midas no valid coupons | 米大师无有效的代金券 |
701115 | midas order alreay paid | 米大师订单已支付 |
701116 | midas no valid rollback coupon | 米大师无对应回滚的代金券 |
702001 | invalid parameter | 参数错误 |
702002 | invalid signature | 用户态签名错误 |
702003 | invalid pay signature | 支付签名错误 |
702004 | invalid mode | 支付模式不合法 |
702005 | out_trade_no repeated, please change | 商户订单号重复 |
702006 | mch is not registered | 商户未进件完成, 不能下单 |
702007 | user unauthorized | 用户未授权, 不能下单 |
702008 | can not use sandbox in release version | 线上版本小程序不能用沙箱环境下单 |
1103002 | target file not exists | 目标图片不存在 |
1103003 | image decode fail | 图片解码失败 |
1103004 | create temp file fail | 临时文件创建失败 |
1103005 | error occurs during the compress process | 压缩图片过程发生错误 |
1103006 | param compress quality invalid | quality非法(<0 or >100) |
1103007 | src image file size zero | 图片长或宽为零 |
1107001 | 用户当前正在观看直播/视频通话/打电话 | |
1107002 | 当前处于rtc模式,但用户没有授予微信录音权限 | |
1107003 | illegal operation in background | 小程序退后台时无法操作 |
1107004 | take snapshot fail | 截图失败 |
1107005 | save to album after take snapshot fail | 截图后保存到相册失败 |
1107006 | save to temp file after take snapshot fail | 截图后保存到临时文件失败 |
1107007 | not in picture in picture mode now | video/live-player组件当前不处于小窗模式下 |
1107008 | exiting picture in picture mode now | video/live-player组件当前正在退出小窗模式 |
1107009 | request background playback but src empty | 进入后台音频播放模式时src为空 |
1107010 | request background playback but in rtc mode | rtc模式下不允许进入后台音频播放模式 |
1107011 | request background playback but in background | page已经进入后台,不允许进入后台音频播放模式 |
1107012 | load resource file fail | 资源文件加载失败 |
1107013 | system permission denied | 准备推流,但用户没有授予微信录音/摄像头权限 |
1300001 | Operation not permitted | 操作不被允许 |
1300002 | No such file or directory | 找不到文件或目录 |
1300005 | Input/output error | 输入输出流不可用 |
1300009 | Bad file descriptor | 无效的fd |
1300013 | Permission denied | 权限错误,文件是只读或只写 |
1300014 | Path permission denied | 传入的路径没有权限 |
1300020 | Not a directory | 指定路径不是目录,常见于指定的写入路径的上级路径为一个文件的情况 |
1300021 | Is a directory | 指定路径是一个目录 |
1300022 | Invalid argument | 无效参数,可以检查length或offset是否越界 |
1300036 | File name too long | 文件名过长 |
1300066 | Directory not empty | 目录不为空 |
1300201 | system error | 系统接口调用失败 |
1300202 | the maximum size of the file storage limit is exceeded | 存储空间不足 |
1300203 | encode error | 字符编码转换失败 |
1300300 | sdcard not mounted | sd card挂载失败 |
1300301 | unable to open as fileType | 无法以fileType打开文件 |
1301000 | permission denied, cannot access file path | 目标路径无访问权限(usr目录) |
1301002 | data to write is empty | 写入数据为空 |
1301003 | illegal operation on a directory | 不可对目录进行此操作 |
1301004 | illegal operation on a package directory | 不可对代码包目录进行此操作 |
1301005 | file already exists | 已有同名文件或目录 |
1301006 | value of length is out of range | length值越界 |
1301007 | value of offset is out of range | offset值越界 |
1301008 | fd argument must be of type number | fd参数的值必须为number类型 |
1301009 | value of position is out of range | position值越界 |
1301100 | store directory is empty | store目录为空 |
1301102 | unzip open file fail | 压缩文件打开失败 |
1301103 | unzip entry fail | 解压单个文件失败 |
1301104 | unzip fail | 解压失败 |
1301111 | brotli decompress fail | brotli解压失败(iOS独有) |
1301112 | tempFilePath file not exist | 指定的tempFilePath找不到文件 |
1302001 | permission denied, fd is writeonly or readonly | fd只读/只写 |
1302002 | excced max concurrent fd limit | fd数量已达上限 |
1302003 | invalid flag | 无效的flag |
1302004 | permission denied when open using flag | 无法使用flag标志打开文件 |
1302005 | array buffer does not exist | 未传入arrayBuffer |
1302100 | array buffer is readonly | arrayBuffer只读 |
1400001 | appid no enough quota | 小程序quota余额不足 |
1402101 | wxa login is blocked | 小程序登录被封禁 |
1416100 | invalid finder username | 非法的视频号id |
1416101 | get finder info failed | 拉取视频号信息失败 |
1416102 | invalid finder feed id | 非法的feed_id |
1416103 | not same contractor | 小程序appid和视频号的同主体校验不通过 |
1416104 | empty finder info | 视频号获取到的数据为空 |
1416105 | get partially visible finder info | 视频号获取到的数据仅部分人可见 |
1416106 | invalid finder token | 非法的视频号token |
1416107 | appid token no permission | 视频号账号关闭小程序token引用 |
1416108 | parse token failed | 解析token失败 |
1416109 | user token hit spam limit | 用户解析token时命中风控限制 |
1420103 | not same contractor | 小程序appid和企业微信的同主体校验不通过 |
1421102 | user getPhoneNumber is blocked | 用户获取手机号能力被封禁 |
1500101 | not init | 未初始化蓝牙适配器 |
1500102 | 当前蓝牙适配器不可用 | |
1500103 | 当前BLE设备获取不到Service/获取不到对应UUID的Service | |
1500104 | 调用系统蓝牙能力失败, 详细错误见errMsg | |
1500105 | system not support | 系统不支持BLE |
1504001 | 系统不支持NFC | |
1504002 | not support HCE | 系统不支持HCE |
1504003 | system NFC switch not opened | 系统NFC开关未打开 |
1504100 | not set default NFC application | 未设置NFC默认应用 |
1504101 | register aids failed | HCE注册aid列表失败 |
1504200 | user is not authorized | 用户未授权App使用NFC能力 |
1504201 | parse NdefMessage failed | 解析NdefMessage失败 |
1504202 | NFC discovery already started | 之前已经调用了startDiscovery |
1504203 | NFC discovery has not started | 之前没有调用startDiscovery |
1504204 | Tech already connected | 当前tech已经连接上 |
1504205 | Tech has not connected | 当前tech还没连接上 |
1504206 | NFC tag has not been discovered | 系统未发现NFC标签 |
1504207 | invalid tech | 无效的tech |
1504208 | unavailable tech | 当前NFC标签不支持该tech |
1504209 | function not support | 不支持该NFC能力 |
1504210 | system internal error | 调用系统NFC能力失败, 详细错误见errMsg |
1505000 | unknown WIFI error | |
1505001 | not invoke startWifi | 未调用startWifi |
1505002 | wifi is disabled | 系统WiFi开关未开启 |
1505003 | maybe not open GPS | 操作失败, 可能是因为系统GPS开关未打开 |
1505004 | maybe not obtain GPS Permission | 操作失败, 可能是因为用户未授予App定位权限 |
1505005 | currentWifi is null | 获取不到当前已连接WiFi |
1505006 | current connected wifi is invalid | 获取到的当前已连接WiFi信息非法, 开发者可以考虑重试 |
1505020 | unknown error | 连接WiFi其他未知错误 |
1505021 | weapp in background | 小程序在后台, 不允许调用connectWifi |
1505022 | open settings fail | 仅Android, 跳转系统设置页情况下跳转失败 |
1505023 | duplicated request | 重复连接WiFi |
1505024 | password error | 密码错误 |
1505025 | wifi config may be expired | 可能是WiFi配置已过期 |
1505026 | fail to connect wifi:time out | 连接WiFi超时 |
1505027 | user denied | 用户拒绝授权连接Wi-Fi |
1505028 | weixin cannot modify system config | 仅iOS,系统/运营商配置拒绝连接Wi-Fi |
1505029 | invalid ssid | 仅iOS,无效的ssid |
1505030 | duplicate request | 仅iOS,上个请求还未完成,重复请求 |
1505031 | invalid WEP / WPA password | 仅iOS,无效的WEP/WPA密码 |
1505032 | system internal error | 系统错误,需要在errMsg中打印更多信息 |
1505040 | 获取当前已连接WiFi失败, 开发者可以考虑稍后重试 | |
1509000 | unknown BLE error | |
1509001 | 连接BLE设备失败 | |
1509002 | 当前Service获取不到Characteristic/获取不到对应UUID的Characteristic | |
1509003 | 未连接上该BLE设备 | |
1509004 | 当前Characteristic不支持该属性,详细错误见errMsg | |
1509005 | BLE操作超时 | |
1509006 | device not found | 未找到设备 |
1509007 | already connect | 当前BLE设备已经连接上 |
1509008 | location permission is denied | Android6.0以上, BLE扫描需授权地理位置 |
1509010 | wait for bluetooth state change timeout | iOS上调用openBluetoothAdapter后客户端等待状态更新超时 |
1510101 | need pin | 配对当前蓝牙设备需要pin码 |
1510102 | reach max bluetooth background count | 支持蓝牙后台通信的设备数目已经达到上限 |
1517001 | the content of the text message exceeds the limit | 短信内容超出长度限制 |
2000000 | AI system error | 系统错误 |
2000001 | AI invalid arguments | 参数错误 |
2000002 | AI client device not supported | 客户端设备不支持 |
2000003 | AI os not supported | 系统不支持 |
2000004 | AI library not supported | 客户端设备不支持 |
2002000 | unknown error | 未知错误 |
2002001 | face detection does not initialize | 人脸检测未初始化 |
2002002 | face detection has duplicated initialization | 人脸检测重复初始化 |
2002003 | face detection has failed initialization | 人脸检测初始化失败 |
2002004 | face not detected or detection failed | 检测不到人脸或检测失败 |
2002005 | stop face detection failed | 停止人脸检测失败 |
2003000 | session unavailable | 会话不可用 |
2003001 | system camera not authorized | 系统相机权限未打开 |
2003002 | camera not authorized | 小程序相机权限未授权 |
2004000 | model path invalid : %s | 非法的模型文件路径 |
2004001 | create session fail : %s | 通过sdk创建session失败 |
2004002 | sessionId is empty | session id 为空 |
2004003 | input tensors is empty | input tensors 为空 |
2004004 | data type [%s] for input tensor [%s] is unsupported | 不支持当前输入数据类型 |
2004005 | invalid session id | 无效的sessionId |
2004006 | data type [%s] for output tensor [%s] is unsupported | 不支持当前输出数据类型 |
2004007 | input tensor [%s] data is invalid : %s | input tensor数据为空 |
2004008 | input tensor has invalid shape : %s | 无效的shape |
2004009 | run session fail(%s) | 通过sdk run session失败 |
2004010 | environment not ready | 环境未准备就绪(比如Android so未加载) |
2004011 | session id not exist | 释放的session id不存在 |
2004012 | the input tensor [%s] MUST have %s attribution | 输入张量缺失属性 |