You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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初始化无问题

排查过程

  1. 验证核心功能:调用crashlytics().crash()可触发强制崩溃,且能立即在控制台显示,说明Crashlytics核心功能正常,问题锁定在recordError方法本身。开启firebase.json中的crashlytics_debug_enabled无改善。

  2. 源码定位问题:
    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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:43:14