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, 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.

challenge icon

Desafío

Fácil

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

Tu programa debe:

  1. Crear una función llamada performTest que acepte tres parámetros de tipo cadena
  2. Dentro de la función, usar una estructura if-else para manejar distintos tipos de prueba:
  3. Si testType es "string_convert": usar std::stoi para convertir value1 en un entero e imprimirlo
  4. Si testType es "math_operation": convertir tanto value1 como value2 en enteros usando std::stoi, después dividir value1 entre value2 e imprimir el resultado
  5. Si testType es "array_access": crear una cadena "Programming", convertir value1 en un índice entero usando std::stoi, después usar 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 comprobar manualmente los límites
  6. Si testType es "unknown_error": lanzar un valor entero 999
  7. En la función principal, llamar a performTest dentro de un bloque try
  8. Usar varios bloques catch para manejar las excepciones en este orden exacto:
  9. Primero: std::invalid_argument& para conversiones no válidas de cadenas a números
  10. Segundo: std::out_of_range& para números demasiado grandes o índices de cadena fuera de los límites
  11. 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 caught

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

Practica por tu cuenta: Compilador de C++ online