为什么catchError无法捕获错误?

时间:2020-08-24 12:02:53

标签: flutter dart

void main() {
  foo().catchError((error) {
    print('Error caught = $error');
  });
}

Future<void> foo() {
  throw Future.error('FooError');
}

当我阅读docs时:

这是“捕获”块的异步等效项。

如果我使用catch块,则会捕获到错误。但是我的catchError无法捕获该错误,但是根据文档,它应该可以。我在做错什么吗?


注意:我知道我可以使用return而不是throw,然后如@CopsOnRoad here所述,错误将被捕获在catchError中。我的问题是,为什么catchError没有捕获到引发的错误,但是catch块确实捕获了该错误。

1 个答案:

答案 0 :(得分:1)

foo()在将Future返回给调用者之前引发错误。因此,并不是catchError不能正常工作,只是错误不会传递回调用者。

如果将foo标记为async,以使该函数实际上返回一个Future,则会发现已捕获错误。

void main() {
  foo().catchError((error) {
    print('Error caught = $error');
  });
}

Future<void> foo() async {
  throw Future.error('FooError');
}

从您接受的linked post答案中可以看到,其功能已标记为async,因此实际上返回了Future可以捕获的catchError

拥有一个返回Future<void>而没有被标记为async并且不返回文字类型Future<void>的函数确实应该是一个错误。