handleError 方法
创建一个包装 Stream,它会拦截从这个 Stream 发送的一些错误。
如果这个 Stream 发送一个匹配 test
的错误,那么它将被 onError
函数拦截。
onError
回调必须为类型 void Function(Object error)
或 void Function(Object error, StackTrace)
。函数类型决定了 onError
是否带有堆栈跟踪参数。如果这个 Stream 收到一个不带堆栈跟踪的错误,则堆栈跟踪参数可能是 StackTrace.empty。
如果测试函数 test(error)
返回 true,则异步错误 error
与测试函数匹配。如果省略 test
,则认为每个错误都匹配。
如果错误被拦截,onError
函数可以决定如何处理它。如果它想要抛出新的(或相同的)错误,可以抛出,或者简单地返回来让这个 Stream 忘记错误。如果 onError
函数再次抛出接收到的 error
值,它就像一个 rethrow
,并与其原始堆栈跟踪一起发射,而不是 onError
内部 throw
的堆栈跟踪。
如果您需要将错误转换为数据事件,请使用更通用的 Stream.transform 将数据事件写入输出接收器来处理事件。
返回的 Stream 如果是广播 Stream,就是这种情况。如果对广播 Stream 进行了多次监听,每个订阅都会单独执行 test
并处理错误。
示例
Stream.periodic(const Duration(seconds: 1), (count) {
if (count == 2) {
throw Exception('Exceptional event');
}
return count;
}).take(4).handleError(print).forEach(print);
// Outputs:
// 0
// 1
// Exception: Exceptional event
// 3
// 4
实现
Stream<T> handleError(Function onError, {bool test(error)?}) {
final void Function(Object, StackTrace) callback;
if (onError is void Function(Object, StackTrace)) {
callback = onError;
} else if (onError is void Function(Object)) {
callback = (Object error, StackTrace _) {
onError(error);
};
} else {
throw ArgumentError.value(
onError,
"onError",
"Error handler must accept one Object or one Object and a StackTrace"
" as arguments.");
}
return new _HandleErrorStream<T>(this, callback, test);
}