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

React Native应用通过Sentry HTTP API上报错误不接管异常处理

保留自定义异常处理同时上报Sentry的实现方案

当然可行!完全可以保留你现有的react-native-exception-handler异常处理流程,同时把错误日志上报到Sentry,核心思路就是在自己的异常回调里手动调用Sentry的上报方法,而不是让Sentry自动接管全局异常捕获。下面分步骤给你讲具体实现:

一、JS 异常的上报处理

首先确保你已经安装并初始化了Sentry SDK,但关键是要禁用Sentry的自动全局异常捕获,避免和你的自定义处理器冲突。

1. 初始化Sentry时禁用自动捕获

在Sentry初始化配置里,过滤掉默认的全局异常捕获集成:

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

Sentry.init({
  dsn: '你的Sentry项目DSN',
  integrations: integrations => {
    // 移除默认的全局异常捕获集成,避免和自定义处理器冲突
    return integrations.filter(integration => integration.name !== 'GlobalHandlers');
  },
  // 可选:禁用自动会话跟踪,完全由自己控制上报时机
  enableAutoSessionTracking: false,
});

2. 在自定义JS异常处理器中手动上报

在你已经配置好的react-native-exception-handler回调里,添加Sentry的上报代码:

import { setJSExceptionHandler } from 'react-native-exception-handler';

const customJSExceptionHandler = (error, isFatal) => {
  // 第一步:执行你的本地日志记录逻辑(离线优先的核心)
  saveErrorToLocalStorage(error, isFatal);
  
  // 第二步:手动将异常上报到Sentry
  Sentry.captureException(error, {
    // 添加自定义标签,方便在Sentry中筛选
    tags: { isFatal: String(isFatal) },
    // 添加额外上下文信息,比如用户ID、设备信息等
    extra: {
      userId: getCurrentUserId(),
      deviceModel: getDeviceModel(),
    },
  });
};

// 注册自定义JS异常处理器
setJSExceptionHandler(customJSExceptionHandler, true);

二、原生异常的上报处理

对于iOS/Android端的原生异常,同样需要在react-native-exception-handler的原生回调里,手动调用Sentry的原生上报方法。

Android 端实现

在你的Android项目中,找到react-native-exception-handler对应的原生处理类(比如ExceptionHandlerModule.java),在异常捕获方法中添加Sentry上报逻辑:

import io.sentry.Sentry;

public class ExceptionHandlerModule extends ReactContextBaseJavaModule {
  // ... 其他已有代码

  public void handleNativeException(Throwable throwable) {
    // 先执行本地日志记录
    writeErrorToLocalFile(throwable);
    
    // 上报到Sentry
    Sentry.captureException(throwable);
  }
}

iOS 端实现

在iOS项目的RNExceptionHandler.m文件中,修改异常处理方法,添加Sentry上报:

@import Sentry;

@implementation RNExceptionHandler

- (void)handleNativeException:(NSException *)exception {
  // 本地日志存储逻辑
  [self saveErrorToLocalDB:exception];
  
  // 上报到Sentry
  [SentrySDK captureException:exception];
}

@end

三、Sentry的POST API:手动创建问题

Sentry确实提供了HTTP API来手动创建事件(也就是你说的“问题”),非常适合你的离线优先场景——当设备恢复网络后,可以批量把本地存储的错误日志通过API上报到Sentry。

核心API端点

POST /api/{org_slug}/{project_slug}/store/

其中org_slug是你的Sentry组织标识,project_slug是项目标识,这两个值可以在Sentry项目的设置页面找到。

请求头要求

  • Authorization: DSN 你的Sentry项目DSN 或者使用Authorization: Bearer 你的项目权限token
  • Content-Type: application/json

请求体示例(JSON)

{
  "event_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6", // 随机生成的唯一UUID
  "timestamp": "2024-05-20T14:30:00Z",
  "platform": "react-native",
  "message": "用户操作时触发的自定义错误",
  "exception": {
    "values": [
      {
        "type": "TypeError",
        "value": "Cannot read property 'name' of undefined",
        "stacktrace": {
          "frames": [
            {
              "filename": "src/screens/ProfileScreen.js",
              "function": "renderUserInfo",
              "lineno": 67,
              "colno": 22
            }
          ]
        }
      }
    ]
  },
  "tags": {
    "environment": "production",
    "app_version": "1.2.0"
  },
  "extra": {
    "user_id": "user_12345",
    "device_os": "iOS 17.4"
  }
}

关键注意点

  • event_id必须是唯一的UUID,每次上报都要生成新的,避免重复事件。
  • 如果不需要完整的栈信息,也可以只传递message字段创建简单的问题。
  • 批量上报时,可以把多个事件打包(但要注意Sentry的API限制),或者逐个发送。

这样就能完美实现你的需求:保留本地异常记录的同时,将错误同步到Sentry,而且完全由你控制上报的时机和内容。

内容的提问来源于stack exchange,提问作者Ashishkumar Pandey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:01:27