Menu
CoddyTech

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.

challenge icon

Desafío

Fácil

Crea 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 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 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 cadena
  2. Dentro de la función, utilizar una estructura if-else para manejar los distintos tipos de prueba:
  3. Si testType es "string_convert": utilizar std::stoi para convertir value1 a un entero e imprimirlo
  4. Si testType es "math_operation": convertir tanto value1 como value2 a enteros usando std::stoi, después dividir value1 entre value2 e imprimir el resultado
  5. Si testType es "array_access": crear la cadena "Programming", convertir value1 en un índice entero usando std::stoi, después utilizar 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 los límites manualmente
  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. Utilizar varios bloques catch para manejar las excepciones en este orden exacto:
  9. Primero: std::invalid_argument& para conversiones no válidas de cadena a número
  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 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 caught

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