如何通过另一个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
相关产品推荐
相关产品推荐

