Mobile App Development · Dart/Flutter
Coloque em prática o que viu no conteúdo: try/catch, on, finally, throw e exceção customizada.
Exercício
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
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
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
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
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
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