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

如何确认SentrySdk.CaptureException上报的异常已成功发送至Sentry云端

如何判断Sentry异常是否成功上报到云端

SentrySdk.CaptureException(ex) 默认是异步非阻塞实现,调用后仅完成事件入队操作并立即返回本地生成的SentryId,不会等待网络请求结果,因此网络错误等上报失败场景不会在调用处抛出异常,也无法直接通过返回值判断上报状态。你可以通过以下几种方式实现上报状态的监听:

  • 方案1:使用SDK内置回调监听上报结果
    Sentry SDK提供了全局回调钩子,可在初始化时配置,分别监听上报前、上报失败事件:
SentrySdk.Init(options =>
{
    // 其他基础配置,如DSN、环境标识等
    options.Dsn = "你的Sentry服务DSN";

    // 事件上报前触发,可在此处记录待上报的事件ID
    options.BeforeSend = sentryEvent =>
    {
        // 可将事件ID存入临时存储,用于后续匹配上报结果
        PendingEventStore.Add(sentryEvent.EventId);
        return sentryEvent;
    };

    // 事件用尽所有重试策略后仍上报失败时触发
    options.SendFailed = (eventId, exception) =>
    {
        // 匹配到待上报事件,处理失败逻辑
        if (PendingEventStore.Remove(eventId))
        {
            // 示例:给用户展示上报失败反馈
            ShowToast("异常上报失败,请检查网络连接后重试");
        }
    };
});

你可以结合业务需求,额外添加上报成功的监听逻辑:在BeforeSend中记录的事件ID如果在配置的超时时间内没有触发SendFailed,即可判定为上报成功。

  • 方案2:同步等待队列处理完成(不建议在UI线程使用)
    如果需要在触发上报的位置实时获取结果,可手动刷新Sentry的本地队列,等待所有待发送事件处理完成:
var eventId = SentrySdk.CaptureException(ex);
// 异步等待最多5秒,直到所有队列事件处理完成
bool isFlushed = await SentrySdk.FlushAsync(TimeSpan.FromSeconds(5));

if (isFlushed)
{
    if (PendingEventStore.Exists(eventId))
    {
        // 上报成功
        ShowToast("异常已成功上报,感谢反馈");
        PendingEventStore.Remove(eventId);
    }
}
else
{
    // 处理超时,判定为上报失败
    ShowToast("异常上报超时,请检查网络后重试");
}

注意不要在UI主线程调用同步等待方法,否则会导致界面卡顿。

  • 方案3:持久化事件状态
    如果需要长期记录上报结果,可将待上报事件ID存入本地数据库/持久化存储,上报成功或失败后更新对应状态,即使用户重启应用也可查询历史上报记录。

内容的提问来源于stack exchange,提问作者Nicola Carminati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:15:03