You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

桌面应用崩溃时如何同步发送Sentry错误报告?

解决Sentry桌面应用崩溃时错误报告无法送达的问题

我之前在Electron桌面应用里也碰到过一模一样的问题!Sentry默认是异步批量发送事件的,当应用因为异常直接崩溃时,进程还没来得及把缓冲里的错误报告发出去就终止了,所以服务器根本收不到。

解决这个问题的核心是强制等待Sentry完成事件发送后再退出应用,具体可以通过Sentry.flush()方法实现:

1. 捕获已知异常时同步发送

在你用Sentry.capture(e)捕获异常后,调用flush()并设置一个合理的超时时间(比如3000毫秒,给足发送时间),等它完成后再退出应用:

try {
  // 你的业务代码逻辑
} catch (error) {
  Sentry.capture(error);
  // 等待Sentry发送完事件,超时3秒
  await Sentry.flush(3000);
  // 手动退出应用(根据你的桌面框架调整,这里以Electron/Node.js为例)
  process.exit(1);
}

如果你的环境里不能用await(比如同步回调场景),可以用Promise链式调用:

try {
  // 你的业务代码逻辑
} catch (error) {
  Sentry.capture(error);
  Sentry.flush(3000)
    .then(() => process.exit(1))
    .catch(() => {
      // 就算发送失败,也确保应用正常退出
      process.exit(1);
    });
}

2. 处理全局未捕获异常

对于那些没被try/catch捕获的全局异常(比如uncaughtException),同样要在处理函数里加入flush()

// Node.js/Electron主进程的全局异常监听
process.on('uncaughtException', async (error) => {
  Sentry.captureException(error);
  await Sentry.flush(3000);
  process.exit(1);
});

// 如果是Electron渲染进程,也可以监听对应的崩溃事件
window.addEventListener('error', async (event) => {
  Sentry.captureException(event.error);
  await Sentry.flush(3000);
  // 渲染进程崩溃的话,可根据需求通知主进程退出或自行处理
});

关键原理说明

Sentry的默认行为是把事件存入缓冲区,异步批量发送来提升性能,但应用崩溃时进程会直接终止,缓冲队列里的事件还没来得及发送就丢失了。flush()方法会等待所有待发送的事件完成提交(或者达到你设置的超时时间),这样就能保证崩溃报告有足够的时间送达服务器。

内容的提问来源于stack exchange,提问作者Pablo Fernandez

火山引擎 最新活动