收藏
回答

wx.onError、App.onError疑惑及如何捕获Promise异常?

1、官方文档上说 wx.onError 和 App.onError 的回调时机与参数一致(https://developers.weixin.qq.com/miniprogram/dev/api/base/app/app-event/wx.onError.html),是指两种方式收集到的异常信息完全一致吗?我们实践过程中发现,wx.onError 获取到的信息比 App.onError 要少。

在我们上一个版本的微信小程序中,我们是在 App.onError 中监控异常,并通过 ELK 收集、查询异常。收集到的部分异常信息截图如下:



在我们小程序的最新版本中,我们使用了针对小程序平台的 Sentry SDK(https://github.com/lizhiyao/sentry-miniapp,该 SDK 原理是使用 wx.onError、wx.onPageNotFound、wx.onMemoryWarning 监控异常信息)进行信息收集上报,基于公司私有化部署的 Sentry 服务接收、存储、展示异常信息。结果发现 Sentry 服务没有收到 wx.onError 上报的异常(1. 上线之前有做过测试,Sentry SDK 是可以正常上报代码执行异常的。 2. 可以收集到页面无法找到、内存警告异常,说明线上版本小程序中 Sentry SDK 已经成功初始化,可以进行信息上报)


但是官方的微信预警群是有推送异常信息的:




2. App.onError 收集到的信息和官方后台运维中心收集到的信息是一致的吗?我们发现 onError 捕获的信息,在小程序官方后台查不到。

比如:

通过 App.onError 在 8.12 收集到了这样一条异常信息:


在小程序官方后台是搜不到这个异常信息记录的:


3. 假设 wx.onError 和 App.onError 获取到的异常信息完全一致,且和官方后台收集记录的异常信息完全一致。如果小程序后台运维中心的预警推送频率设置为 1次/5min,那么 onError 获取到的信息和微信预警群推送的信息完全一致吗?

4. 关于 Promise 的异常,对于浏览器有 window.onunhandledrejection,对于 node 有 global.process.on('unhandledRejection', callback()),对于小程序平台,有什么推荐的方式可以获取到 Promise 的异常吗?官方后台运维中心有收集到小程序中 Promise 中的异常吗?目前实践来看,小程序的 App.onError、wx.onError 中是无法捕获 Promise 的异常的。示例代码可参考:https://github.com/lizhiyao/sentry-miniapp/blob/master/examples/weapp/app.js

5. 在小程序官方后台及官方预警群中,会发现偶尔会出现非线上版本的异常被收集和上报了。请问这种情况是正常的吗?

比如:截图中 小程序版本对应为 0 的就是我们未发布版本代码中出现的异常。判断的依据是 /pages/homepage-config/skilled-tag/index 是新版本新增的页面,异常上报时新版本并未发布。







最后一次编辑于  2019-08-15
回答关注问题邀请回答
收藏

3 个回答

  • LastLeaf
    LastLeaf
    2019-08-16
    1. 一致的。

    2. 官方运维平台展示的错误经过了类别过滤,只会展示最终由小程序本身代码触发的问题,信息的确会少一些。

    3. 预警群和运维平台一样有类别过滤。

    4. 我们查下看看是不是有问题。

    5. 如果版本号是 0 的话,那就是未上线版本的报错。我们看看这里是不是需要调整一下。

    2019-08-16
    有用
    回复 34
    • 2019-08-16
      非常感谢耐心回复。 期待接下来第 4、5 点可以得到进一步的回复。
      2019-08-16
      回复
    • LastLeaf
      LastLeaf
      2019-08-16回复
      4. 目前 android 上有个 bug 还在修复中。 5. 这里之后会优化一下展示。
      2019-08-16
      回复
    • 2019-08-16回复LastLeaf
      4. 是指 iOS 上 wx.onError 和 app.onError 是可以获取到 Promise 的异常? 5. 「之后会优化一下」是指会把未发布版本的异常全部过滤掉,只保留线上版本的异常吗?
      2019-08-16
      回复
    • LastLeaf
      LastLeaf
      2019-08-16回复
      4. 是的。 5. 具体怎么做现在我们还没有定,也有可能是分别展示或者展示时说明正式版/开发版。
      2019-08-16
      回复
    • 2019-08-16回复LastLeaf
      https://github.com/lizhiyao/sentry-miniapp/tree/master/examples/weapp 这个 demo 项目中,在开发者工具上 app.onError 没有捕获到 async 函数中、Promise 中和 wx api 的异常,是我使用 onError 的方式不对吗?还是只能真机上才可以捕获?
      2019-08-16
      1
      回复
    查看更多(29)
  • FAITH
    FAITH
    2021-12-02

    wx.onError并不能捕获Promise的异常啊,真机测试了,IOS,安卓都不行,基础库都2.21.0了

    2021-12-02
    有用
    回复
  • 2019-08-27

    看到这个帖子的同学,可以顺便了解一下开源的 Sentry 小程序 SDK:https://github.com/lizhiyao/sentry-miniapp

    2019-08-27
    有用
    回复 2
    • 华
      2022-12-27
      你好,我引入你这个sdk,发现有些错误能上报,有些上报不了的。还有github你的微信图片展示不了
      2022-12-27
      回复
    • Lgowen
      Lgowen
      04-23回复
      这是用uniapp做的吧,我这边排查之后是发现需要单独引入sentry对vue相关的插件就管用了,它内置没有暴露出来其实
      integrations: [new Integrations.Vue({ Vue, attachProps: true })]
      初始化的时候
      04-23
      回复
登录 后发表内容
问题标签