Menu
Coddy logo textTech

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.

challenge icon

Desafío

Fácil

Crea 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 testType que representa el tipo de prueba a realizar ("string_convert", "math_operation", "array_access", o "unknown_error")
  • Una cadena value1 que se utilizará como el dato principal para la operación
  • Una cadena value2 que se utilizará como dato secundario para algunas operaciones

Tu programa debe:

  1. Crear una función llamada performTest que reciba tres parámetros de tipo string
  2. Dentro de la función, usar una estructura if-else para manejar los diferentes tipos de prueba:
  3. Si testType es "string_convert": usa std::stoi para convertir value1 a un entero e imprímelo
  4. Si testType es "math_operation": convierte tanto value1 como value2 a enteros usando std::stoi, luego divide value1 por value2 e imprime el resultado
  5. Si testType es "array_access": crea una cadena "Programming", convierte value1 a un índice entero usando std::stoi, luego usa str.at(index) para acceder al carácter en ese índice e imprimirlo. El método .at() lanza automáticamente std::out_of_range si el índice no es válido; no es necesario realizar una comprobación de límites manual
  6. Si testType es "unknown_error": lanza un valor entero 999
  7. En la función main, llama a performTest dentro de un bloque try
  8. Usa múltiples bloques catch para manejar las excepciones en este orden exacto:
  9. Primero: std::invalid_argument& para conversiones de cadena a número no válidas
  10. Segundo: std::out_of_range& para números demasiado grandes o índices de cadena fuera de rango
  11. 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 caught

Recuerda 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;
}
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