catchErrorがエラーをキャッチできないのはなぜですか?

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

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

私がドキュメントを読んだとき:

これは、「catch」ブロックの非同期版です。

catchブロックを使用すると、エラーが発生します。しかし、私catchErrorはエラーをキャッチすることができませんが、ドキュメントによると、それはすべきです。私は何か間違ったことをしていますか?


注:return代わりに使用できることはわかっています。@ CopsOnRoadで説明さthrowcatchErrorているように、エラーが検出されます。私の質問は、なぜcatchErrorスローされたエラーをcatchキャッチしないのに、ブロックはそれをキャッチするのかということです。

回答

1 ChristopherMoore Aug 24 2020 at 22:11

foo()Future呼び出し元に返す前にエラーをスローします。したがって、それが機能していないわけでcatchErrorはなく、エラーが呼び出し元に戻されないだけです。

あなたがマークした場合fooのようにasyncその機能が実際に返すことFutureは、エラーがキャッチされていることがわかります。

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

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

リンクされた投稿の承認された回答から、キャッチできるasyncaFutureが実際に返されるように、それらの関数がマークされていることがわかりますcatchError

Future<void>マークを付けasyncずに戻り、リテラル型を返さない関数があるFuture<void>と、エラーになるはずです。