Ce face runZonedGuarded
Erorile din future-uri pe care nu le așteaptă nimeni, din timere sau din stream-uri fără onError nu pot fi prinse cu un try/catch obișnuit. runZonedGuarded rulează body într-o zonă care trimite toate aceste erori la onError, în loc să oprească programul.
Este folosit mai ales la nivelul de sus al aplicației (de exemplu în Flutter), pentru a trimite erorile neprevăzute într-un jurnal. Cu zoneValues poți atașa valori pe care le citești din zonă cu Zone.current[cheie].
Parametri
| Parametru | Descriere |
|---|---|
body |
Codul rulat în zona nouă. |
onError |
Funcția chemată pentru fiecare eroare netratată, cu eroarea și stiva. |
zoneValues |
Opțional: valori atașate zonei. |
Ce returnează
Rezultatul lui body, sau null dacă body a aruncat sincron o eroare.
Exemple
Exemplul 1: Erori din timere și future-uri neașteptate
import 'dart:async';
void main() {
runZonedGuarded(() {
Timer(const Duration(milliseconds: 10), () => throw StateError('eroare în timer'));
Future.delayed(const Duration(milliseconds: 20), () => throw const FormatException('date corupte'));
print('Codul a pornit operațiile');
}, (eroare, stiva) {
print('Prins de zonă: $eroare');
});
}
Rezultat
Codul a pornit operațiile
Prins de zonă: Bad state: eroare în timer
Prins de zonă: FormatException: date corupte
Exemplul 2: Jurnal de erori pentru o aplicație
import 'dart:async';
final jurnal = <String>[];
Future<void> aplicatie() async {
print('Aplicația rulează');
unawaited(Future(() => throw Exception('sincronizare eșuată')));
await Future.delayed(const Duration(milliseconds: 10));
print('Aplicația continuă');
}
void main() {
runZonedGuarded(
() async {
await aplicatie();
print('Erori în jurnal: $jurnal');
},
(e, _) => jurnal.add('$e'),
);
}
Rezultat
Aplicația rulează
Aplicația continuă
Erori în jurnal: [Exception: sincronizare eșuată]
Greșeli frecvente
- Folosești
runZonedGuardedîn loc detry/catchpentru erori pe care le poți trata local. Zona este o plasă de siguranță, nu tratarea normală a erorilor.
Comenzi înrudite
Zone: Contextul în care rulează codul asincron; Zone.current este zona de acum, din care poți citi valori atașate.Zone.run: fork creează o zonă copil cu valori sau reguli proprii; run execută o funcție în interiorul unei zone.Future.catchError: Prinde eroarea unui future și o înlocuiește cu o valoare de rezervă (echivalentul lui catch pentru lanțuri then).unawaited: unawaited marchează un future pe care intenționat nu-l aștepți; Future.ignore îl ignoră complet, cu tot cu erori.