runZonedGuarded în Dart

Rulează cod într-o zonă nouă și prinde toate erorile asincrone netratate din ea, cu o singură funcție.

Sintaxă
import 'dart:async';

R? runZonedGuarded<R>(R body(), void onError(Object error, StackTrace stack), {Map<Object?, Object?>? zoneValues, ZoneSpecification? zoneSpecification})

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 de try/catch pentru 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.