catchError 抽象方法

Future<T> catchError(
  1. Function onError, {
  2. bool test(
    1. Object error
    )?,
})

处理由此 Future 发出的错误。

这是异步的 "catch" 块的等效。

返回一个新的 Future,该 Future 将完成此 Future 的结果或调用 onError 回调的结果。

如果此 Future 以值完成,则返回的 Future 以相同的值完成。

如果此 Future 以错误完成,则首先使用错误值调用 test

如果 test 返回 false,则异常不会被此 catchError 处理,并且返回的 Future 以与此 Future 相同的错误和堆栈跟踪完成。

如果 test 返回 true,则使用错误和可能堆栈跟踪调用 onError,并且返回的 Future 以与 then's onError 相同的方式完成。

如果省略 test,则默认为始终返回 true 的函数。该 test 函数不应抛出异常,但如果它抛出,则视为 onError 函数抛出。

注意,Future 不会延迟报告错误直到添加了监听器。如果第一个 catchError(或 then)调用发生在此 Future 以错误完成之后,则错误报告为未处理错误。请参阅 Future 的描述。

示例

Future.delayed(
  const Duration(seconds: 1),
  () => throw 401,
).then((value) {
  throw 'Unreachable';
}).catchError((err) {
  print('Error: $err'); // Prints 401.
}, test: (error) {
  return error is int && error >= 400;
});

实现

// The `Function` below stands for one of two types:
// - (dynamic) -> FutureOr<T>
// - (dynamic, StackTrace) -> FutureOr<T>
// Given that there is a `test` function that is usually used to do an
// `is` check, we should also expect functions that take a specific argument.
Future<T> catchError(Function onError, {bool test(Object error)?});