handleError 方法
创建一个包装 Stream,它会拦截来自此 Stream 的某些错误。
如果此 Stream 发送了一个匹配 test
的错误,那么它将被 onError
函数拦截。
onError
回调必须是类型 void Function(Object error)
或 void Function(Object error, StackTrace)
。函数类型决定了是否使用堆栈跟踪参数调用 onError
。如果此 Stream 收到的错误没有堆栈跟踪,堆栈跟踪参数可以是 StackTrace.empty。
异步错误 error
通过测试函数匹配,如果 test(error)
返回 true。如果省略 test
,则认为每个错误都匹配。
如果错误被拦截,onError
函数可以决定如何处理它。如果它想引发一个新的(或相同的)错误,则可以抛出;或者简单地返回,使此 Stream 忘记错误。如果 onError
函数再次抛出接收到的 error
值,它就像一个 rethrow
,并且它与其原始堆栈跟踪一起发出,而不是 onError
内部 throw
的堆栈跟踪。
如果您需要将错误转换为数据事件,请使用更通用的 Stream.transform 来通过向输出汇合器写入数据事件来处理事件。
返回的 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);
}