El manejador genérico (catch-all)
Parte de la sección Lógica y Flujo del Journey de C++ de Coddy — lección 52 de 56.
A veces, su programa puede encontrar errores inesperados que no encajan en los tipos de excepción específicos que ha planeado. El manejador genérico catch(...) proporciona una red de seguridad que captura cualquier excepción que no haya sido manejada por sus bloques catch más específicos.
El manejador universal utiliza tres puntos (...) en lugar de especificar un tipo de excepción particular. Debe colocarse después de todos los demás bloques catch, ya que C++ los comprueba en orden:
try {
// Code that might throw various exceptions
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}El manejador catch-all actúa como un respaldo para cualquier tipo de excepción que no haya sido capturada por los bloques anteriores. Esto es particularmente útil cuando se trabaja con código que podría lanzar excepciones que no has anticipado, asegurando que tu programa no falle debido a errores inesperados.
Si bien no puedes acceder a los detalles específicos de la excepción en un bloque catch-all, aún puedes proporcionar un mensaje de error genérico y realizar operaciones de limpieza para que tu programa siga funcionando sin problemas.
Desafío
FácilCrea un programa que demuestre un manejo exhaustivo de excepciones utilizando múltiples bloques catch, incluyendo un manejador universal (catch-all). Este desafío pondrá a prueba tu comprensión sobre cómo manejar tanto tipos de excepciones específicos como errores inesperados que no encajan en categorías predefinidas.
Se proporcionarán las siguientes entradas:
- Una cadena
testTypeque representa el tipo de prueba a realizar ("string_convert","math_operation","array_access", o"unknown_error") - Una cadena
value1que se utilizará como el dato principal para la operación - Una cadena
value2que se utilizará como dato secundario para algunas operaciones
Tu programa debe:
- Crear una función llamada
performTestque reciba tres parámetros de tipo string - Dentro de la función, usar una estructura if-else para manejar los diferentes tipos de prueba:
- Si testType es
"string_convert": usastd::stoipara convertir value1 a un entero e imprímelo - Si testType es
"math_operation": convierte tanto value1 como value2 a enteros usandostd::stoi, luego divide value1 por value2 e imprime el resultado - Si testType es
"array_access": crea una cadena"Programming", convierte value1 a un índice entero usandostd::stoi, luego usastr.at(index)para acceder al carácter en ese índice e imprimirlo. El método.at()lanza automáticamentestd::out_of_rangesi el índice no es válido; no es necesario realizar una comprobación de límites manual - Si testType es
"unknown_error": lanza un valor entero999 - En la función main, llama a
performTestdentro de un bloquetry - Usa múltiples bloques
catchpara manejar las excepciones en este orden exacto: - Primero:
std::invalid_argument¶ conversiones de cadena a número no válidas - Segundo:
std::out_of_range¶ números demasiado grandes o índices de cadena fuera de rango - Tercero:
catch(...)como el manejador universal para cualquier otro tipo de excepción
Usa el siguiente formato de salida exacto:
Para operaciones exitosas:
Success: [result_value]Para diferentes tipos de excepciones:
Invalid argument caught
Out of range caught
Unknown exception caughtRecuerda que el manejador universal catch(...) debe colocarse al final, ya que C++ comprueba los bloques catch en orden. Este manejador capturará cualquier tipo de excepción que no haya sido manejada por los bloques catch específicos anteriores, incluyendo la excepción de tipo entero lanzada en el caso de "unknown_error". El manejador universal proporciona una red de seguridad para errores inesperados, permitiendo al mismo tiempo un manejo específico para tipos de excepciones conocidos.
Hoja de referencia
El manejador universal catch(...) proporciona una red de seguridad que captura cualquier excepción no manejada por bloques catch específicos.
El manejador universal utiliza tres puntos (...) y debe colocarse después de todos los demás bloques catch, ya que C++ los comprueba en orden:
try {
// Code that might throw various exceptions
} catch (std::invalid_argument& e) {
std::cout << "Invalid input!" << std::endl;
} catch (std::out_of_range& e) {
std::cout << "Number too large!" << std::endl;
} catch (...) {
std::cout << "An unexpected error occurred!" << std::endl;
}El manejador universal actúa como un respaldo para cualquier tipo de excepción que no haya sido capturada por los bloques anteriores. Aunque no se puede acceder a los detalles específicos de la excepción en un bloque universal, se pueden proporcionar mensajes de error genéricos y realizar operaciones de limpieza.
Pruébalo tú mismo
#include <iostream>
#include <string>
#include <stdexcept>
using namespace std;
// TODO: Escribe tu código aquí - crea la función performTest
int main() {
// Leer entrada
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Escribe tu código abajo - implementa bloques try-catch y llama a performTest
return 0;
}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
1Punteros y memoria
¿Qué es un puntero?Operador de direcciónOperador de desreferenciaPunteros nulosPunteros y arraysMemoria dinámica con 'new'Liberar memoria con 'delete'Resumen: Práctica de punteros2Vectores (Arrays dinámicos)
Introducción a std::vectorCreación de un VectorAgregar elementosAcceder a los elementosTamaño del VectorIterar con un bucle ForBucle For basado en rangosEliminar elementosResumen - Operaciones con Vectores5Proyecto: Herramienta de inventario
Configuración del proyectoAgregar y actualizar artículos8Manejo básico de errores
Introducción a las excepcionesLos bloques 'try' y 'catch'La palabra clave 'throw'Diferentes tipos de excepcionesEl manejador genérico (catch-all)Repaso: División segura3Proyecto: Herramienta de lista de tareas
Descripción general del proyectoAñadir una tarea