Stream.handleError în Dart

Creează un stream nou care prinde erorile (toate sau doar unele) și lasă să treacă mai departe doar valorile.

Sintaxă
Stream<T> handleError(Function onError, {bool test(dynamic error)?})

Ce face Stream.handleError

handleError cheamă onError pentru fiecare eroare din stream și nu o mai trimite mai departe; valorile trec neschimbate. Astfel, un await for pe stream-ul nou nu mai aruncă excepții pentru acele erori.

Cu test alegi ce erori se prind; celelalte merg mai departe. Atenție: un stream creat cu async* se închide după prima eroare aruncată, deci valorile de după ea nu mai vin, chiar dacă eroarea este prinsă.

Parametri

Parametru Descriere
onError Funcția care primește eroarea (și, opțional, stiva).
test Opțional: alege ce erori se prind.

Ce returnează

Un Stream<T> nou, fără erorile prinse.

Exemple

Exemplul 1: Linii invalide ignorate

Future<void> main() async {
  final linii = Stream.fromIterable(['12', 'abc', '30', '4x', '8']);
  final numere = linii.map(int.parse).handleError((Object e) {
    print('  linie ignorată: ${(e as FormatException).source}');
  });
  print('Suma: ${await numere.fold<int>(0, (a, b) => a + b)}');
}

Rezultat

  linie ignorată: abc
  linie ignorată: 4x
Suma: 50

Exemplul 2: Doar anumite erori, cu test

Future<void> main() async {
  final s = Stream<int>.multi((c) {
    c.add(1);
    c.addError(const FormatException('format greșit'));
    c.add(2);
    c.addError(StateError('conexiune pierdută'));
    c.close();
  });
  try {
    await for (final v in s.handleError((Object e) => print('  ignor: $e'), test: (e) => e is FormatException)) {
      print('valoare $v');
    }
  } on StateError catch (e) {
    print('eroare gravă: ${e.message}');
  }
}

Rezultat

valoare 1
  ignor: FormatException: format greșit
valoare 2
eroare gravă: conexiune pierdută

Greșeli frecvente

  • Te aștepți ca după handleError să primești valorile de după eroare dintr-un stream async*. Generatorul s-a oprit la eroare; tratează eroarea în interiorul lui dacă vrei să continue.

Comenzi înrudite

  • Stream.listen: Începe ascultarea unui stream: o funcție pentru fiecare valoare, una pentru erori, una pentru final.
  • Future.catchError: Prinde eroarea unui future și o înlocuiește cu o valoare de rezervă (echivalentul lui catch pentru lanțuri then).
  • Stream.timeout: Emite o eroare TimeoutException (sau cheamă onTimeout) dacă între două valori trece mai mult decât timpul dat.