Mobile App Development · Dart/Flutter

17 · Exceções

Trate erros em tempo de execução sem derrubar o programa: try, catch, on, finally, throw e exceções customizadas.

1Objetivo da aula

Nesta aula você vai aprender a lidar com situações inesperadas — como uma conversão de texto inválida ou uma regra de negócio violada — sem deixar o programa travar. Você vai envolver código arriscado em try/catch, capturar tipos específicos de erro com on, garantir limpeza de recursos com finally, lançar erros manualmente com throw e criar suas próprias classes de exceção para deixar as regras do domínio mais expressivas.

2O que vamos aprender

try / catch

Envolve um trecho de código que pode falhar e captura a exceção, permitindo continuar a execução em vez de encerrar o programa.

on FormatException

Captura apenas um tipo específico de exceção, tornando o tratamento mais preciso do que um catch genérico.

finally

Bloco executado sempre, com ou sem erro. Ideal para liberar recursos como conexões e arquivos abertos.

throw

Lança uma exceção manualmente quando uma regra do programa é violada, interrompendo a função e propagando o erro para quem a chamou.

implements Exception

Cria uma classe de exceção customizada para representar um erro específico do domínio da aplicação.

catch (erro)

Captura o objeto da exceção em uma variável, permitindo inspecionar ou exibir sua mensagem com interpolação de string.

on Tipo catch (erro)

Combina a captura de um tipo específico com o acesso ao objeto do erro — o melhor dos dois mundos.

Boas práticas

Evite catch vazio, mostre mensagens amigáveis ao usuário e não use exceções para controlar o fluxo normal do programa.

3Exemplo comentado

// Demonstração de tratamento de exceções com try/catch em Dart.
// 'try' envolve o código que pode lançar um erro.
// 'catch' captura a exceção e permite tratá-la sem encerrar o programa.
void main() {
  // Simulação de entrada inválida que não pode ser convertida para int.
  String idadeTexto = 'vinte';

  // O bloco 'try' tenta executar o código; se falhar, vai para o 'catch'.
  try {
    // int.parse() lança FormatException se a String não for um número inteiro.
    int idade = int.parse(idadeTexto);
    print('Idade: $idade');
    // O bloco 'catch' captura qualquer exceção e permite uma resposta controlada.
  } catch (erro) {
    // Em vez de travar o programa, exibe uma mensagem amigável ao usuário.
    print('Nao foi possivel converter a idade.');
  }
}

4Saída esperada

Nao foi possivel converter a idade.

5Do conteúdo para a prática

6Prática sugerida