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 encontrar errores inesperados que no encajan en los tipos específicos de excepciones que has previsto. El controlador general catch(...) proporciona una red de seguridad que captura cualquier excepción que no haya sido gestionada por tus bloques catch más específicos.
El controlador general usa 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 varias 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 cuando trabajas con código que podría lanzar excepciones que no habías previsto, lo que garantiza que tu programa no se bloquee debido a errores inesperados.
Aunque no puedes acceder a los detalles específicos de la excepción en un bloque general de captura, aún puedes proporcionar un mensaje de error genérico y realizar operaciones de limpieza para que tu programa siga funcionando correctamente.
Desafío
FácilCrea un programa que demuestre un manejo integral de excepciones mediante varios bloques catch, incluido un controlador general. 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 datos principales para la operación - Una cadena
value2que se utilizará como datos secundarios para algunas operaciones
Tu programa debe:
- Crear una función llamada
performTestque acepte tres parámetros de tipo cadena - Dentro de la función, usar una estructura if-else para manejar distintos tipos de prueba:
- Si testType es
"string_convert": usarstd::stoipara convertir value1 en un entero e imprimirlo - Si testType es
"math_operation": convertir tanto value1 como value2 en enteros usandostd::stoi, después dividir value1 entre value2 e imprimir el resultado - Si testType es
"array_access": crear una cadena"Programming", convertir value1 en un índice entero usandostd::stoi, después usarstr.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 manualmente los límites - Si testType es
"unknown_error": lanzar un valor entero999 - En la función principal, llamar a
performTestdentro de un bloquetry - Usar varios bloques
catchpara manejar las excepciones en este orden exacto: - Primero:
std::invalid_argument¶ conversiones no válidas de cadenas a números - Segundo:
std::out_of_range¶ números demasiado grandes o índices de cadena fuera de los límites - Tercero:
catch(...)como controlador general para cualquier otro tipo de excepción
Usa el siguiente formato de salida exacto:
Para operaciones exitosas:
Success: [result_value]Para distintos tipos de excepciones:
Invalid argument caught
Out of range caught
Unknown exception caughtRecuerda que el controlador general 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 general proporciona una red de seguridad para los errores inesperados, al tiempo que 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() {
// Leer la entrada
string testType;
string value1;
string value2;
cin >> testType;
cin >> value1;
cin >> value2;
// TODO: Escribe tu código a continuación - implementa los 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