catchError 抽象方法
处理由这个 Future 发出的错误。
这是异步的“捕获”块的等价物。
返回一个新的 Future,它将以这个 future 的结果或调用 onError
回调的结果来完成。
如果这个 future 以一个值完成,返回的 future 将使用相同的值完成。
如果这个 future 以一个错误完成,则首先用错误值调用 test
。
如果 test
返回 false
,这个异常不会被这个 catchError
处理,返回的 future 将使用与这个 future 相同的错误和堆栈跟踪来完成。
如果 test
返回 true
,则使用错误和可能的堆栈跟踪调用 onError
,并且返回的 future 将以与 then 的 onError
相同的方式完成。
如果省略了 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)?});