React Native Firebase:crashlytics().recordError未在控制台显示问题排查
Firebase Crashlytics recordError 无法捕获Axios返回的Error对象
问题背景
项目已完成Firebase Crashlytics配置,且功能正常(能接收部分JS侧错误),但调用crashlytics().recordError(err, 'api_error')上报Axios返回的Error子类对象时,该错误始终无法在Crashlytics控制台显示。
环境与前置排查
- 测试环境为TestFlight构建,未使用Xcode调试器/打包器
- 已多次重启应用并等待错误上报
- Crashlytics控制台未设置任何筛选规则
- 其他JS警告、非致命错误可正常显示,SDK初始化无问题
排查过程
验证核心功能:调用
crashlytics().crash()可触发强制崩溃,且能立即在控制台显示,说明Crashlytics核心功能正常,问题锁定在recordError方法本身。开启firebase.json中的crashlytics_debug_enabled无改善。源码定位问题:
recordError内部依赖StackTrace.fromError解析错误栈,该方法进一步调用ErrorStackParser.parse处理错误对象。查看ErrorStackParser.parse源码:parse: function ErrorStackParser$$parse(error) { if (typeof error.stacktrace !== 'undefined' || typeof error['opera#sourceloc'] !== 'undefined') { return this.parseOpera(error); } else if (error.stack && error.stack.match(CHROME_IE_STACK_REGEXP)) { return this.parseV8OrIE(error); } else if (error.stack) { return this.parseFFOrSafari(error); } else { throw new Error('Cannot parse given Error object'); } },调试发现,Axios返回的Error对象不满足上述任何解析条件,导致代码抛出
Cannot parse given Error object异常,直接中断错误上报流程。
临时解决方案
手动将Axios错误包装为标准Error对象,确保带有可被解析的错误栈:
// 捕获Axios请求错误时 try { const response = await axios.get('/api/xxx'); } catch (axiosErr) { // 构造可被Crashlytics解析的标准Error const reportError = new Error(axiosErr.message); reportError.name = axiosErr.name || 'AxiosError'; // 优先保留原错误栈,若无则使用新Error的栈 reportError.stack = axiosErr.stack || reportError.stack; // 上报包装后的错误 crashlytics().recordError(reportError, 'api_error'); }
内容的提问来源于stack exchange,提问作者Can Poyrazoğlu
相关产品推荐
相关产品推荐

