Perché catchError non è in grado di rilevare l'errore?

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

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

Mentre leggo i documenti :

Questo è l'equivalente asincrono di un blocco "catch".

Se uso il catchblocco, l'errore viene rilevato. Ma il mio catchErrornon è in grado di rilevare l'errore, ma secondo i documenti dovrebbe. Sto facendo qualcosa di sbagliato?


Nota: so che posso usare al returnposto di throwe l'errore verrà quindi catturato catchErrorcome dichiarato da @CopsOnRoad qui . La mia domanda è perché catchErrornon sta rilevando un errore generato ma il catchblocco lo cattura.

Risposte

1 ChristopherMoore Aug 24 2020 at 22:11

foo()genera un errore prima di restituire il Futureal chiamante. Quindi non catchErrorè che non funzioni , l'errore non viene semplicemente restituito al chiamante.

Se contrassegni foocome in asyncmodo che la funzione restituisca effettivamente a Future, vedrai che l'errore viene rilevato.

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

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

Vedrai dalla risposta accettata del tuo post collegato che la loro funzione è contrassegnata in asyncmodo che Futurevenga effettivamente restituito un che catchErrorpuò catturare.

Avere una funzione che ritorna Future<void>senza essere contrassegnata asynce non restituisce un tipo letterale Future<void>dovrebbe essere davvero un errore.