catchError 抽象方法

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

处理由这个 Future 发出的错误。

这是异步的“捕获”块的等价物。

返回一个新的 Future,它将以这个 future 的结果或调用 onError 回调的结果来完成。

如果这个 future 以一个值完成,返回的 future 将使用相同的值完成。

如果这个 future 以一个错误完成,则首先用错误值调用 test

如果 test 返回 false,这个异常不会被这个 catchError 处理,返回的 future 将使用与这个 future 相同的错误和堆栈跟踪来完成。

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

如果省略了 test,它默认为一个总是返回 true 的函数。《code>test 函数不应该抛出异常,但如果抛出异常,则像 onError 函数抛出异常一样进行处理。

请注意,futures 不会延迟错误报告直到监听器添加。如果在错误完成后这个 future 的第一个 catchError(或 then)调用发生,则错误报告为未处理错误。请参阅 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)?});