Capturando Exceções com 'on'
Parte da seção Lógica & Fluxo do Journey de Dart da Coddy — lição 40 de 65.
Embora o bloco básico try-catch capture qualquer exceção que ocorra, às vezes você precisa lidar com diferentes tipos de exceções de maneiras diferentes. A palavra-chave on permite capturar tipos específicos de exceção e fornecer respostas personalizadas para cada uma.
Em vez de capturar todas as exceções com um catch genérico, você pode segmentar exceções específicas usando on seguido pelo tipo da exceção. Isso oferece mais controle sobre como seu programa responde a diferentes situações de erro.
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}Neste exemplo, o código captura especificamente uma FormatException, que ocorre ao tentar analisar um texto inválido como um número. Isso permite que você forneça uma mensagem clara e amigável ao usuário que aborda diretamente o problema, em vez de mostrar uma mensagem de erro genérica que pode confundir os usuários.
Você também pode combinar múltiplos blocos on para lidar com diferentes tipos de exceção com respostas apropriadas, tornando o seu tratamento de erros preciso e amigável ao usuário.
Desafio
FácilCrie um programa que demonstre a captura de exceções específicas usando a palavra-chave on. Seu programa processará diferentes tipos de entradas de usuário e lidará com tipos de exceção específicos com mensagens de erro personalizadas.
- Leia uma entrada de string representando um tipo de expressão matemática (
"parse","divide"ou"access") - Leia uma entrada de string representando o primeiro valor
- Leia uma entrada de string representando o segundo valor (quando aplicável)
- Com base no tipo de expressão, realize a operação correspondente usando tratamento de exceção específico:
- Para
"parse": Converta o primeiro valor para um inteiro usandoint.parse()e captureFormatExceptionespecificamente - Para
"divide": Faça o parse de ambos os valores como inteiros e realize a divisão, capturandoFormatExceptionpara erros de parse - Para
"access": Crie uma lista com o primeiro valor e acesse o índice especificado pelo segundo valor, capturandoRangeErrorpara índices inválidos - Exiba os resultados ou mensagens de erro específicas no formato exato mostrado abaixo
Por exemplo, se as entradas forem "parse", "42", "unused", seu programa deve imprimir:
Operation: parse
Input: 42
Parsing successful!
Result: 42Se as entradas forem "parse", "xyz", "unused", seu programa deve imprimir:
Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integerSe as entradas forem "divide", "10", "2", seu programa deve imprimir:
Operation: divide
Values: 10, 2
Division successful!
Result: 5Se as entradas forem "divide", "10", "abc", seu programa deve imprimir:
Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbersSe as entradas forem "access", "hello", "1", seu programa deve imprimir:
Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0Seu programa deve usar blocos try-catch separados com a palavra-chave on para capturar FormatException e RangeError especificamente. Cada tipo de exceção deve ter sua própria mensagem de erro personalizada que explique claramente o que deu errado. Para a operação "access", crie uma lista contendo apenas o primeiro valor de entrada e tente acessar o índice especificado pelo segundo valor de entrada.
Folha de consulta
Use a palavra-chave on para capturar tipos específicos de exceção em vez de usar um bloco catch genérico:
try {
int number = int.parse("abc");
} on FormatException {
print("Please enter a valid number");
}Você pode combinar múltiplos blocos on para lidar com diferentes tipos de exceção com respostas apropriadas:
try {
// algum código que pode lançar diferentes exceções
} on FormatException {
print("Invalid format error");
} on RangeError {
print("Index out of range error");
}Essa abordagem oferece mais controle sobre o tratamento de erros, permitindo respostas personalizadas para cada tipo específico de exceção.
Experimente você mesmo
import 'dart:io';
void main() {
// Ler entrada
String? operation = stdin.readLineSync();
String? firstValue = stdin.readLineSync();
String? secondValue = stdin.readLineSync();
// Exibir informações da operação
print('Operation: $operation');
// TODO: Escreva seu código abaixo
// Use blocos try-catch com a palavra-chave 'on' para tratar exceções específicas
// Trate FormatException para operações de parse e divisão
// Trate RangeError para operação de acesso
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Manipulação Avançada de Listas
Propriedades de Lista: first & lastEstado da Lista: isEmpty & isNotEmptyInvertendo uma ListaAdicionando a uma Lista: insertRemoção em Listas: removeWhereBuscando em uma Lista: indexOfOrdenando uma ListaEmbaralhando uma ListaRecapitulação - Organizador de Listas4Manipulação Avançada de Mapas
Iterando sobre um MapVerificando Chaves e ValoresPropriedades do Map: keys & valuesAdição Condicional: putIfAbsentRemovendo Entradas de um MapMaps AninhadosRecapitulação - Atualização de Inventário2Operações Funcionais em Listas
Transformando com 'map'Filtrando com 'where'Usando '.toList()'Verificando Condições com 'any'Condições com 'every'Encontrando com 'firstWhere'Recapitulação - Filtragem de Dados5Projeto: Cálculo de Carrinho de Compras
Configuração do ProjetoAdicionando Itens ao Carrinho3Conjuntos
O que é um Conjunto?Criando um ConjuntoAdicionando e Removendo de ConjuntosVerificando Elementos em um ConjuntoConvertendo uma Lista para um ConjuntoUnião de ConjuntosInterseção de ConjuntosDiferença de ConjuntosRecapitulação - Lista de Convidados Únicos6Tratamento de Erros Básico
O que são Exceções?O Bloco 'try-catch'Capturando Exceções com 'on'O Bloco 'finally'Lançando uma ExceçãoRecapitulação - Divisão Segura