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ă
handleErrorsă primești valorile de după eroare dintr-un streamasync*. 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.