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

Expo+React Native中Sentry捕获非Error对象的显示问题

解决Expo React Native中Sentry完整捕获非Error对象的问题

方法1:将非Error对象转为Error实例并附加额外信息

Sentry对原生Error对象的解析更完善,你可以把非Error对象的内容转成Error的message,同时将原对象的所有属性作为extra传入,这样控制台既能看到错误提示,又能查看完整属性值:

function captureNonErrorException(obj) {
  // 把对象序列化为字符串作为Error的消息
  const error = new Error(JSON.stringify(obj));
  // 将原对象属性全部放入extra字段
  Sentry.Native.captureException(error, {
    extra: { ...obj }
  });
}

// 使用示例
const frameworkError = { code: 'INVALID_INPUT', message: '邮箱格式错误', details: { field: 'email' } };
captureNonErrorException(frameworkError);

方法2:用captureMessage直接记录并附加对象

如果不需要堆栈跟踪,仅需记录非Error对象的内容,可以使用captureMessage,并将对象作为extra传入,同时标记错误级别:

function captureNonError(obj) {
  Sentry.Native.captureMessage('非Error类型异常', {
    extra: { ...obj },
    level: 'error' // 保持和exception一致的错误级别
  });
}

方法3:全局配置beforeSend自动处理非Error对象

通过Sentry初始化时的beforeSend钩子,可以全局拦截并转换非Error对象,不用每次调用都手动处理:

import * as Sentry from '@sentry/react-native';

Sentry.init({
  dsn: '你的DSN',
  // 其他初始化配置
  beforeSend(event, hint) {
    // 检查是否是Sentry提示的非Error异常
    if (event.exception?.values?.[0]?.value?.includes('Non-Error exception captured')) {
      const originalObj = hint.originalException;
      // 确认是对象且不是Error实例
      if (originalObj && typeof originalObj === 'object' && !(originalObj instanceof Error)) {
        // 更新事件的message和extra字段
        event.message = JSON.stringify(originalObj);
        event.extra = { ...event.extra, ...originalObj };
        // 替换异常的显示文本
        event.exception.values[0].value = JSON.stringify(originalObj);
      }
    }
    return event;
  }
});

注意事项

  • 如果对象存在循环引用,JSON.stringify会失败,这时可以用flatted这类库进行序列化,或者手动剔除循环引用的属性。
  • 确保Expo项目中Sentry集成正确:已安装@sentry/react-native,并配置了Expo的Sentry插件(expo install @sentry/react-native)。

内容的提问来源于stack exchange,提问作者Antoine Sindhu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:13:34