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

Flutter Dio:如何避免Cancel Token错误被上报至Sentry

Flutter Dio:如何避免Cancel Token错误被上报至Sentry

我太懂这种烦恼了——用Dio的Cancel Token取消请求本来是正常的业务逻辑,结果Sentry把这些“假错误”一股脑儿都报上来,搞得错误日志里全是噪音,根本没法专注看真问题。你之前试的beforeSend思路是对的,只是在异常的判断逻辑上踩了小坑,我来帮你修正一下。

问题出在哪?

你之前直接判断hint is DioException,但实际上Sentry的hint参数是一个Hint对象,真正的Dio异常是存在它的originalException属性里的,所以你的条件根本没触发,导致取消错误还是被上报了。

正确的实现方式

我们需要先从hint里取出原始异常,再判断它是不是Dio的取消类型错误,具体代码如下:

await SentryFlutter.init(
  (options) {
    const sentryDsn = String.fromEnvironment('SENTRYDSN', defaultValue: '[REDACTED]');
    options.dsn = sentryDsn;
    options.tracesSampleRate = 1.0;
    options.reportPackages = false;
    
    options.beforeSend = (event, hint) {
      // 从hint中获取原始异常
      final originalException = hint?.originalException;
      
      // 判断是否是Dio的Cancel Token错误
      if (originalException is DioException && originalException.type == DioExceptionType.cancel) {
        // 返回null表示不上报该事件
        return null;
      }
      
      // 其他异常正常上报
      return event;
    };
  },
);

可选:封装判断逻辑

如果你的项目里经常需要判断这类错误,可以把判断逻辑抽成一个辅助函数,让代码更整洁:

bool isDioCancelError(Object? exception) {
  return exception is DioException && exception.type == DioExceptionType.cancel;
}

然后在beforeSend里直接调用:

if (isDioCancelError(originalException)) {
  return null;
}

测试验证

改完代码后,手动触发一个请求取消操作,比如在请求发出后立刻调用cancelToken.cancel(),然后去Sentry的错误面板里看看,应该就不会再出现这类取消错误的上报了。

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 07:19:29