Menu
Coddy logo textTech

Capturar excepciones con 'on'

Parte de la sección Lógica y Flujo del Journey de Dart de Coddy — lección 40 de 65.

Mientras que el bloque try-catch básico captura cualquier excepción que ocurra, a veces es necesario manejar diferentes tipos de excepciones de diferentes maneras. La palabra clave on te permite capturar tipos de excepciones específicos y proporcionar respuestas personalizadas para cada uno.

En lugar de capturar todas las excepciones con un catch genérico, puedes dirigirte a excepciones específicas usando on seguido del tipo de excepción. Esto te da más control sobre cómo responde tu programa a diferentes situaciones de error.

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

En este ejemplo, el código captura específicamente una FormatException, que ocurre al intentar analizar texto no válido como un número. Esto le permite proporcionar un mensaje claro y fácil de entender que aborda directamente el problema, en lugar de mostrar un mensaje de error genérico que podría confundir a los usuarios.

También puedes combinar múltiples bloques on para manejar diferentes tipos de excepciones con respuestas apropiadas, haciendo que tu manejo de errores sea tanto preciso como amigable para el usuario.

challenge icon

Desafío

Fácil

Crea un programa que demuestre cómo capturar excepciones específicas utilizando la palabra clave on. Tu programa procesará diferentes tipos de entradas de usuario y manejará tipos de excepciones específicos con mensajes de error personalizados.

  1. Lee una entrada de cadena que represente un tipo de expresión matemática ("parse", "divide", o "access")
  2. Lee una entrada de cadena que represente el primer valor
  3. Lee una entrada de cadena que represente el segundo valor (cuando sea aplicable)
  4. Basándote en el tipo de expresión, realiza la operación correspondiente utilizando el manejo de excepciones específico:
    • Para "parse": Convierte el primer valor a un entero usando int.parse() y captura específicamente FormatException
    • Para "divide": Convierte ambos valores a enteros y realiza la división, capturando FormatException para errores de conversión
    • Para "access": Crea una lista con el primer valor y accede al índice especificado por el segundo valor, capturando RangeError para índices inválidos
  5. Muestra los resultados o mensajes de error específicos en el formato exacto que se muestra a continuación

Por ejemplo, si las entradas son "parse", "42", "unused", tu programa debería mostrar:

Operation: parse
Input: 42
Parsing successful!
Result: 42

Si las entradas son "parse", "xyz", "unused", tu programa debería mostrar:

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

Si las entradas son "divide", "10", "2", tu programa debería mostrar:

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

Si las entradas son "divide", "10", "abc", tu programa debería mostrar:

Operation: divide
Values: 10, abc
FormatException caught: Invalid number format
Cannot perform division with invalid numbers

Si las entradas son "access", "hello", "1", tu programa debería mostrar:

Operation: access
List: [hello]
Index: 1
RangeError caught: Index out of range
Valid indices are 0 to 0

Tu programa debe usar bloques try-catch separados con la palabra clave on para capturar FormatException y RangeError específicamente. Cada tipo de excepción debe tener su propio mensaje de error personalizado que explique claramente qué salió mal. Para la operación "access", crea una lista que contenga solo el primer valor de entrada e intenta acceder al índice especificado por el segundo valor de entrada.

Hoja de referencia

Use la palabra clave on para capturar tipos de excepciones específicos en lugar de usar un bloque catch genérico:

try {
  int number = int.parse("abc");
} on FormatException {
  print("Please enter a valid number");
}

Puede combinar múltiples bloques on para manejar diferentes tipos de excepciones con las respuestas adecuadas:

try {
  // algún código que podría lanzar diferentes excepciones
} on FormatException {
  print("Invalid format error");
} on RangeError {
  print("Index out of range error");
}

Este enfoque proporciona más control sobre el manejo de errores al permitir respuestas personalizadas para cada tipo de excepción específico.

Pruébalo tú mismo

import 'dart:io';

void main() {
  // Leer entrada
  String? operation = stdin.readLineSync();
  String? firstValue = stdin.readLineSync();
  String? secondValue = stdin.readLineSync();
  
  // Mostrar información de la operación
  print('Operation: $operation');
  
  // TODO: Escribe tu código a continuación
  // Usa bloques try-catch con la palabra clave 'on' para manejar excepciones específicas
  // Maneja FormatException para las operaciones de parseo y división
  // Maneja RangeError para la operación de acceso
  
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y Flujo