如何确认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
相关产品推荐
相关产品推荐

