Aegis 实例会自动对 JS 执行错误、Promise 执行错误、接口请求异常、返回码异常进行监控并上报。本文介绍各错误监控的实现逻辑及处理方式。
注意:
仅引入 SDK 而未实例化时,Aegis 不会上报任何数据。
RN 环境没有 DOM,资源加载失败、WebSocket 异常、白屏监控等浏览器专属能力不适用于 RN,本文不予覆盖。
JS 执行错误
RN 环境没有
window.onerror,Aegis 通过改写 RN 全局错误处理(ErrorUtils.setGlobalHandler)捕获应用中的 JS 执行错误,将错误信息及堆栈自动上报到后台。上报内容格式为
错误信息 + 堆栈(${error}\\n${error.stack}),日志等级为 error(全量上报),达到阈值时自动告警并影响应用评分。SDK 对
ErrorUtils.setGlobalHandler 做了防覆盖包装,实现了 SDK 监控逻辑与业务自身错误监听之间共存,互不丢失。Promise 执行错误
Aegis 监听未被
catch 的 Promise 错误(unhandled rejection),按 JS 引擎能力自动选择采集通道:运行环境 | 采集方式 |
Hermes 引擎(RN 0.64+ 默认) | HermesInternal.enablePromiseRejectionTracker(allRejections: true) |
旧版 RN(非 Hermes) | promise/setimmediate/rejection-tracking polyfill |
为了页面稳定性,建议您
catch 住所有 Promise 错误。接口请求异常(XHR / Fetch)
Aegis 改写
XMLHttpRequest 与 fetch,监听每次接口请求,以下情况视为异常请求并上报(日志等级为 Ajax 请求异常):1.
http status 大于等于400;2. 请求超时(
timeout);3. 请求结束时
http status 仍然是0(通常发生于请求失败,如网络错误、跨域、cancel 等)。注意:
返回码异常(retcode)
Aegis 通过两种途径识别返回码异常:
接口响应返回码
开启
reportApiSpeed: true 后,Aegis 会尝试从接口响应 body 的第一层(第一层取不到再取第二层)的 code、ret、retcode、errcode 中获取返回码,默认返回码为0视为正常、非0视为异常;返回码异常时会上报一条 retcode 异常日志(等级为返回码异常)。Promise 拒绝携带的返回码(RN 特有)
部分网络请求库以 Promise reject 的方式抛出业务异常,错误对象形如:
{error: {networkError: false,retcode: 500,},}
Aegis 在 Promise 错误采集通道中识别该结构:当
error.networkError 为 false 时,归类为返回码异常(RET_ERROR)上报;当 error.networkError 为 true 时视为纯网络错误,忽略不上报(避免与接口请求异常重复上报)。