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

如何通过另一个Stream监听时处理流错误且不中断流?

解决Dart中通过中间Stream转发时错误不中断流的问题

当使用await for迭代源Stream时,源Stream抛出的错误会直接终止迭代流程,导致中间Stream(stream2)提前结束,无法接收后续数据。要实现和直接监听源Stream一致的错误处理后继续接收数据的效果,需要换一种方式监听源Stream。

修改后的完整代码

Future<void> main() async {
  // 现在stream2可处理错误且不中断流
  stream2().listen(print, onError: print);
  /* 
   * 运行结果:
   * 
   * 0
   * 1
   * 2
   * Exception: Error at 3
   * 4
   * 
   */
}

// 不可修改的源Stream
final stream1 = Stream<int>.periodic(Duration(seconds: 1), (i) {
  if (i == 3) {
    throw Exception("Error at $i");
  }
  return i;
}).take(5);

Stream<int> stream2() async* {
  // 使用listen替代await for,手动处理每个事件
  final subscription = stream1.listen(
    (item) => yield item,
    onError: (e) => yield* Stream.error(e),
  );
  // 等待源Stream完成,避免stream2提前结束
  await subscription.asFuture();
}

关键说明

  • 用stream1.listen替代await for:源Stream的错误会被onError回调捕获,不会终止整个迭代流程,后续数据仍能正常接收
  • 事件转发逻辑:onData中直接yield数据,onError中通过yield* Stream.error(e)将错误转发给stream2的监听者
  • 等待源Stream完成:await subscription.asFuture()确保stream2不会提前关闭,直到源Stream的所有事件(包括错误和结束信号)处理完毕

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 19:05:20