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.
Desafío
FácilCrea 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.
- Lee una entrada de cadena que represente un tipo de expresión matemática (
"parse","divide", o"access") - Lee una entrada de cadena que represente el primer valor
- Lee una entrada de cadena que represente el segundo valor (cuando sea aplicable)
- 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 usandoint.parse()y captura específicamenteFormatException - Para
"divide": Convierte ambos valores a enteros y realiza la división, capturandoFormatExceptionpara errores de conversión - Para
"access": Crea una lista con el primer valor y accede al índice especificado por el segundo valor, capturandoRangeErrorpara índices inválidos - 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: 42Si las entradas son "parse", "xyz", "unused", tu programa debería mostrar:
Operation: parse
Input: xyz
FormatException caught: Invalid number format
Please provide a valid integerSi las entradas son "divide", "10", "2", tu programa debería mostrar:
Operation: divide
Values: 10, 2
Division successful!
Result: 5Si 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 numbersSi 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 0Tu 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
}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
1Manipulación avanzada de listas
Propiedades de listas: first y lastEstado de la lista: isEmpty y isNotEmptyInvertir una listaAñadir a una lista: insertEliminación en listas: removeWhereBúsqueda en una lista: indexOfOrdenar una listaMezclar una listaResumen - Organizador de listas4Manipulación avanzada de mapas
Iterar sobre un mapaComprobación de claves y valoresPropiedades del mapa: keys y valuesAdición condicional: putIfAbsentEliminar entradas de un mapaMapas anidadosResumen - Actualización de inventario2Operaciones funcionales con listas
Transformar con 'map'Filtrar con 'where'Uso de '.toList()'Comprobar condiciones con 'any'Condiciones con 'every'Búsqueda con 'firstWhere'Resumen - Filtrado de datos5Proyecto: Calculadora de carrito de compras
Configuración del proyectoAgregar artículos al carrito3Conjuntos
¿Qué es un Conjunto?Crear un ConjuntoAñadir y eliminar elementos de un ConjuntoComprobar elementos en un ConjuntoConvertir una lista en un ConjuntoUnión de ConjuntosIntersección de ConjuntosDiferencia de ConjuntosResumen - Lista de invitados única6Manejo básico de errores
¿Qué son las excepciones?El bloque 'try-catch'Capturar excepciones con 'on'El bloque 'finally'Lanzar una excepciónResumen - División segura