在使用部分小程序 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 接口未在隐私协议中