handleError 方法

Stream<T> handleError(
  1. Function onError, {
  2. bool test(
    1. dynamic error
    )?,
})

创建一个包装 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);
}