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
相关产品推荐
相关产品推荐

