【发布时间】:2020-12-05 01:50:40
【问题描述】:
我无法理解的简短示例:
Stream<int> getNumbersWithException() async* {
for (var i = 0; i < 10; i++) {
yield i;
if (i == 3) throw Exception();
}
}
有用法:
getNumbersWithException()
.handleError((x) => print('Exception caught for $x'))
.listen((event) {
print('Observed: $event');
});
这将在 3 处停止并输出:
Observed: 0
Observed: 1
Observed: 2
Observed: 3
Exception caught for Exception: foo
根据文档 (https://dart.dev/tutorials/language/streams) 和 (https://api.dart.dev/stable/2.9.1/dart-async/Stream/handleError.html),这是符合预期的,因为抛出的异常会自动关闭流。
- 这是否意味着在流中处理异常以使订阅可以长期存在于此类事件中的正确方法是在流本身内处理异常?从外部无法做到这一点?
- 广播流也一样吗?
- 如果我以错误的方式思考这个问题,有什么建议可以开始正确思考?
我目前认为流是异步数据事件的来源,有时可能是错误事件。从文档和示例来看,一切看起来都很整洁,但我认为想要处理错误并继续观察数据流是一个正常的用例。我很难编写代码来做到这一点。但是,我可能做错了。任何见解将不胜感激。
编辑:我可以补充一点,我已经尝试了各种方法,例如使用流转换器,结果相同:
var transformer = StreamTransformer<int, dynamic>.fromHandlers(
handleData: (data, sink) => sink.add(data),
handleError: (error, stackTrace, sink) =>
print('Exception caught for $error'),
handleDone: (sink) => sink.close(),
);
getNumbersWithException().transform(transformer).listen((data) {
print('Observed: $data');
});
另外,listen() 有一个可选参数 cancelOnError,看起来很有希望,但它默认为 false,所以这里没有雪茄。
【问题讨论】:
-
这可能是不可能的,这是可以理解的。查看引发异常的代码时,流继续下去意味着什么?它需要以一种意味着它继续的方式被抛出,并且异常通常不会以这种方式工作。这就引出了一个问题,有没有这样的方法可以做到这一点?要创建错误事件,但还能继续吗?
标签: dart reactive-programming dart-stream