Menu
Coddy logo textTech

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.

challenge icon

Desafio

Fácil

Crie 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.

  1. Leia uma entrada de string representando um tipo de expressão matemática ("parse", "divide" ou "access")
  2. Leia uma entrada de string representando o primeiro valor
  3. Leia uma entrada de string representando o segundo valor (quando aplicável)
  4. 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 usando int.parse() e capture FormatException especificamente
    • Para "divide": Faça o parse de ambos os valores como inteiros e realize a divisão, capturando FormatException para erros de parse
    • Para "access": Crie uma lista com o primeiro valor e acesse o índice especificado pelo segundo valor, capturando RangeError para índices inválidos
  5. 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: 42

Se as entradas forem "parse", "xyz", "unused", seu programa deve imprimir:

Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integer

Se as entradas forem "divide", "10", "2", seu programa deve imprimir:

Operation: divide
Values: 10, 2
Division successful!
Result: 5

Se 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 numbers

Se 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 0

Seu 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
  
}
quiz iconTeste seus conhecimentos

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