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, tu programa puede encontrarse con errores inesperados que no encajan en los tipos de excepción específicos que has previsto. El controlador general catch(...) proporciona una red de seguridad que captura cualquier excepción que no hayan gestionado tus bloques catch más específicos.
El controlador general utiliza tres puntos (...) en lugar de especificar un tipo de excepción concreto. Debe colocarse después de todos los demás bloques catch, ya que C++ los comprueba en orden:
try {
// Código que podría lanzar diversas excepciones
} 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 controlador general actúa como alternativa para cualquier tipo de excepción que no haya sido capturada por los bloques anteriores. Esto resulta especialmente útil al trabajar con código que podría lanzar excepciones que no habías previsto, y garantiza que tu programa no se bloquee debido a errores inesperados.
Aunque no puedas 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 el manejo integral de excepciones utilizando varios bloques catch, incluido un controlador que captura todas las excepciones. Este desafío pondrá a prueba tu comprensión de 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 que se realizará ("string_convert","math_operation","array_access"o"unknown_error") - Una cadena
value1que se utilizará como 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 cadena - Dentro de la función, utilizar una estructura if-else para manejar los distintos tipos de prueba:
- Si
testTypees"string_convert": utilizarstd::stoipara convertirvalue1a un entero e imprimirlo - Si
testTypees"math_operation": convertir tantovalue1comovalue2a enteros usandostd::stoi, después dividirvalue1entrevalue2e imprimir el resultado - Si
testTypees"array_access": crear la cadena"Programming", convertirvalue1en un índice entero usandostd::stoi, después utilizarstr.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 comprobar los límites manualmente - Si
testTypees"unknown_error": lanzar un valor entero999 - En la función principal, llamar a
performTestdentro de un bloquetry - Utilizar varios bloques
catchpara manejar las excepciones en este orden exacto: - Primero:
std::invalid_argument¶ conversiones no válidas de cadena a número - Segundo:
std::out_of_range¶ números demasiado grandes o índices de cadena fuera de los límites - Tercero:
catch(...)como controlador que captura todas las demás excepciones
Utiliza el siguiente formato de salida exacto:
Para las operaciones exitosas:
Success: [result_value]Para los distintos tipos de excepciones:
Invalid argument caught
Out of range caught
Unknown exception caughtRecuerda que el controlador catch(...) debe colocarse al final, ya que C++ comprueba los bloques catch en orden. Este controlador capturará cualquier tipo de excepción que no haya sido manejado por los bloques catch específicos anteriores, incluida la excepción entera lanzada en el caso "unknown_error". El controlador que captura todas las excepciones ofrece una red de seguridad para los errores inesperados y, al mismo tiempo, permite un manejo específico de los tipos de excepciones conocidos.
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() {
// Lee la entrada
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Escribe tu código a continuación - 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 tareaPractica por tu cuenta: Compilador de C++ online