Mobile App Development · Dart/Flutter

17 · Exceções — Exercícios

Coloque em prática o que viu no conteúdo: try/catch, on, finally, throw e exceção customizada.

Exercício

exercicio_01_try_catch.dart

Converte um texto inválido ('vinte') para int dentro de um try. Como int.parse() lança FormatException para textos não numéricos, o catch genérico captura o erro e exibe uma mensagem amigável em vez de derrubar o programa.

// 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.');
  }
}

Saída esperada

Nao foi possivel converter a idade.

Como executar

dart run 17-Excecoes/02_Exercicios/codigo_fonte/exercicio_01_try_catch.dart

Exercício

exercicio_02_format_exception.dart

Tenta converter 'R$ 10' para double. Como o texto contém o símbolo R$, double.parse() lança FormatException, capturada especificamente com on FormatException em vez de um catch genérico.

// Demonstração de captura específica de FormatException com 'on'.
// 'on TipoDeExcecao' captura apenas exceções do tipo especificado,
// tornando o tratamento mais preciso do que um 'catch' genérico.
void main() {
  // Simulação de um preço em formato inválido (texto em vez de número).
  String precoTexto = 'R\$ 10';

  try {
    // double.parse() lança FormatException porque 'R$ 10' não é um double válido.
    double preco = double.parse(precoTexto);
    print('Preco: $preco');
    // 'on FormatException' captura especificamente erros de formato de dados.
  } on FormatException {
    // Mensagem descritiva orientando o formato correto esperado.
    print('Formato de preco invalido. Use apenas numeros e ponto decimal.');
  }
}

Saída esperada

Formato de preco invalido. Use apenas numeros e ponto decimal.

Como executar

dart run 17-Excecoes/02_Exercicios/codigo_fonte/exercicio_02_format_exception.dart

Exercício

exercicio_03_finally.dart

Mostra que o bloco finally executa sempre, mesmo quando o try não lança nenhuma exceção. Neste exemplo o catch nunca é acionado, mas finally ainda assim roda por último — útil para liberar recursos.

// Demonstração do bloco 'finally' em Dart.
// 'finally' é executado SEMPRE ao fim do try/catch, independentemente
// de o código ter funcionado com sucesso ou lançado uma exceção.
// Muito útil para liberar recursos (fechar arquivos, conexões, etc.).
void main() {
  // O bloco 'try' tenta executar o código normalmente.
  try {
    print('Abrindo recurso');
    print('Processando dados');
    // O bloco 'catch' seria executado se houvesse uma exceção.
  } catch (erro) {
    print('Erro ao processar dados');
    // O bloco 'finally' sempre é executado — com ou sem exceção.
  } finally {
    // Garante que o recurso será fechado mesmo se ocorrer um erro.
    print('Fechando recurso');
  }
}

Saída esperada

Abrindo recurso
Processando dados
Fechando recurso

Como executar

dart run 17-Excecoes/02_Exercicios/codigo_fonte/exercicio_03_finally.dart

Exercício

exercicio_04_throw_validacao.dart

A função validarIdade lança uma Exception manualmente com throw quando a idade é negativa. Como o exemplo chama validarIdade(-3), a exceção é lançada e capturada pelo catch em main — a linha print('Idade valida') nunca é alcançada. Com uma idade não negativa, a validação passaria normalmente e essa linha seria impressa.

// Demonstração do uso de 'throw' para lançar exceções manualmente.
// 'throw' interrompe a execução da função e propaga uma exceção
// para quem chamou a função, que deve tratá-la com try/catch.

// Valida a idade e lança uma Exception se o valor for inválido.
void validarIdade(int idade) {
  if (idade < 0) {
    // 'throw' lança uma Exception com uma mensagem descritiva do erro.
    // A execução da função para aqui se a condição for verdadeira.
    throw Exception('Idade nao pode ser negativa.');
  }
}

void main() {
  // O try/catch captura a Exception lançada por 'validarIdade'.
  try {
    // Tenta validar uma idade negativa — isso vai lançar uma Exception.
    validarIdade(-3);
    // Esta linha só é executada se validarIdade não lançar exceção.
    print('Idade valida');
  } catch (erro) {
    // 'erro' contém o objeto Exception lançado, com a mensagem de erro.
    print('Erro de validacao: $erro');
  }
}

Saída esperada

Erro de validacao: Exception: Idade nao pode ser negativa.

Como executar

dart run 17-Excecoes/02_Exercicios/codigo_fonte/exercicio_04_throw_validacao.dart

Exercício

exercicio_05_excecao_customizada.dart

Cria a classe SaldoInsuficienteException, que implementa Exception e sobrescreve toString() para retornar diretamente a mensagem. Ao tentar sacar 150 com saldo de 100, sacar() lança essa exceção, capturada com on SaldoInsuficienteException catch (erro).

// Demonstração de criação de exceção customizada em Dart.
// Exceções customizadas permitem criar erros específicos do domínio da aplicação,
// tornando o código mais expressivo e o tratamento de erros mais preciso.

// Exceção customizada que implementa a interface Exception do Dart.
class SaldoInsuficienteException implements Exception {
  // Armazena a mensagem descritiva do erro.
  final String mensagem;

  SaldoInsuficienteException(this.mensagem);

  // @override substitui o método toString() para retornar a mensagem customizada.
  // Isso permite usar print(erro) diretamente para ver a mensagem.
  @override
  String toString() => mensagem;
}

// Tenta realizar um saque; lança SaldoInsuficienteException se o valor exceder o saldo.
void sacar(double saldo, double valor) {
  if (valor > saldo) {
    throw SaldoInsuficienteException('Saldo insuficiente para saque.');
  }

  print('Saque realizado com sucesso.');
}

void main() {
  try {
    // Tenta sacar 150 com apenas 100 de saldo — vai lançar a exceção customizada.
    sacar(100, 150);
    // 'on SaldoInsuficienteException' captura apenas este tipo específico de exceção.
  } on SaldoInsuficienteException catch (erro) {
    // 'erro' chama toString() internamente, exibindo a mensagem da exceção.
    print(erro);
  }
}

Saída esperada

Saldo insuficiente para saque.

Como executar

dart run 17-Excecoes/02_Exercicios/codigo_fonte/exercicio_05_excecao_customizada.dart

Exercício

exercicio_06_lista_com_erros.dart

Percorre a lista ['10', 'abc', '30', 'x'], tentando converter cada item para int. Como cada iteração tem seu próprio try/catch, uma entrada inválida não interrompe o laço: os itens válidos são convertidos e os inválidos apenas geram um aviso.

// Demonstração de tratamento de exceções dentro de um laço.
// Permite processar uma lista com entradas mistas (válidas e inválidas)
// sem interromper todo o processamento quando um item causar erro.
void main() {
  // Lista com mistura de entradas válidas ('10', '30') e inválidas ('abc', 'x').
  List<String> entradas = ['10', 'abc', '30', 'x'];

  // Percorre cada entrada da lista tentando convertê-la para int.
  for (String entrada in entradas) {
    // Cada iteração tem seu próprio try/catch — um erro não para o laço inteiro.
    try {
      // int.parse() lança FormatException para entradas que não são inteiros.
      int numero = int.parse(entrada);
      print('Numero valido: $numero');
      // Captura especificamente FormatException para tratar entradas não numéricas.
    } on FormatException {
      // O programa continua para o próximo item em vez de parar.
      print('Entrada invalida ignorada: $entrada');
    }
  }
}

Saída esperada

Numero valido: 10
Entrada invalida ignorada: abc
Numero valido: 30
Entrada invalida ignorada: x

Como executar

dart run 17-Excecoes/02_Exercicios/codigo_fonte/exercicio_06_lista_com_erros.dart