Monitoramento de Exceções no Flutter: Entendendo o Conceito de Zonas no Dart

O Conceito de Zone no Dart

Uma Zone no Dart representa um ambiente estável durante chamadas assíncronas, funcionando como uma sandbox isolada para a execução de código. Ela permite observar e tratar exceções não capturadas dentro de seu escopo.

Criando uma Zone

O método runZonedGuarded é utilizado para instanciar uma Zone. Parâmetros como zoneValues para dados privados e zoneSpecification para personalização de comportamentos são fundamentais.

void main() {
  runZonedGuarded(() {
    // Código a ser executado na zona
  }, (erro, rastreamento) {
    // Tratamento de exceções não capturadas
  });
}

Principais Usos das Zonas

Captura de Exceções Assíncronas

Zones são eficazes para captruar exceções em operações assíncronas que normalmente encerrariam a aplicação. Exemplo com manipulação de temporizador:

import 'dart:async';

void main() {
  runZonedGuarded(() {
    Future.delayed(Duration.zero, () {
      throw 'Exceção que causaria encerramento do app';
    });
  }, (erro, rastreamento) {
    print('Erro não capturado: $erro');
  });
}

Contudo, apenas exceções assíncronas e de lógica comum são capturadas. Exceções do framework Flutter, como erros de renderização, requerem tratamento via FlutterError.onError, enquanto exceções de isolates nativas ou do motor Flutter estão fora do alcance.

Sobrescrita de Funções dentro da Zone

É possível redefinir métodos como print() em uma Zone para interceptar saídas.

void main() {
  runZoned(() {
    print('Mensagem de teste');
  }, zoneSpecification: ZoneSpecification(
    print: (self, parent, zone, texto) {
      parent.print(zone, 'Interceptado: $texto');
    }
  ));
}

Injeção de Lógica ao Entrar ou Sair da Zone

Zones oferecem pontos de hook para executar ações, como monitoramento de desempenho, sem alterar o código original.

import 'dart:async';

final tempoTotal = Stopwatch();
final tempoExecucao = Stopwatch();

final config = ZoneSpecification(run: <r>(self, parent, zone, func) {
  tempoExecucao.start();
  try {
    return parent.run(zone, func);
  } finally {
    tempoExecucao.stop();
  }
});

void main() {
  runZoned(() {
    tempoTotal.start();
    processarDados();
    executarTarefa();
    tarefaAssincrona().then((_) {
      print(tempoTotal.elapsedMilliseconds);
      print(tempoExecucao.elapsedMilliseconds);
    });
  }, zoneSpecification: config);
}

void processarDados() => print('Processamento iniciado');

void executarTarefa() => print('Tarefa em andamento');

Future<void> tarefaAssincrona() {
  return Future.delayed(Duration(seconds: 5), () => print('Concluído'));
}</void></r>

Armazenamento de Dados Privados na Zone

Cada Zone pode manter dados locais, similar ao armazenamento por thread, acessíveis via zoneValues.

import 'dart:async';

void main() {
  Zone zonaPrimaria = Zone.current.fork(zoneValues: {"usuario": "Carlos"});
  Zone zonaSecundaria = zonaPrimaria.fork(zoneValues: {"config": 98765});
  zonaSecundaria.run(() {
    print(zonaSecundaria["usuario"]); // Carlos
    print(zonaSecundaria["config"]); // 98765
  });
}

Tags: Flutter Dart Zonas Tratamento de Exceções assincrono

Publicado em 6-28 19:27