注意:仅引入 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 等)。
注意:Aegis SDK 在错误发生时不会主动收集接口请求参数和返回信息,如需对接口信息进行上报,可通过配置 api.apiDetail: true 开启(详见 配置文档)。
四、返回码异常(retcode)
Aegis 通过两种途径识别返回码异常:
·接口响应返回码
开启 reportApiSpeed: true 后,Aegis 会尝试从接口响应 body 的第一层(第一层取不到再取第二层)的 code、ret、retcode、errcode 中获取返回码,默认返回码为0视为正常、非0视为异常;返回码异常时会上报一条 retcode 异常日志(等级为返回码异常)。
可通过 api.retCodeHandler 自定义返回码获取逻辑与异常判定,详见 配置文档 中的 api.retCodeHandler 示例。
·Promise 拒绝携带的返回码(RN 特有)
部分网络请求库以 Promise reject 的方式抛出业务异常,错误对象形如:
{ error: { networkError: false, retcode: 500, },}
Aegis 在 Promise 错误采集通道中识别该结构:当 error.networkError 为 false 时,归类为返回码异常(RET_ERROR)上报;当 error.networkError 为 true 时视为纯网络错误,忽略不上报(避免与接口请求异常重复上报)。