Sobes.tech
Junior

¿Qué son las excepciones en C++?

sobes.tech AI

Respuesta de la IA

Mecanismo de manejo de situaciones anómalas (errores) que ocurren durante la ejecución del programa. Permite separar el código que se encarga de la lógica del programa del código de manejo de errores.

Palabras clave:

  • try: Define un bloque de código donde pueden ocurrir excepciones.
  • catch: Define un bloque de código que se ejecuta cuando ocurre un tipo específico de excepción.
  • throw: Genera (crea) una excepción. El tipo de excepción puede ser cualquier objeto.

Principio de funcionamiento:

  1. El código que puede causar un error se coloca en el bloque try.
  2. Si en el bloque try ocurre una excepción (generada con throw), la ejecución normal del programa se interrumpe.
  3. El sistema busca un bloque catch adecuado capaz de manejar la excepción generada (por tipo).
  4. Si se encuentra un catch correspondiente, se ejecuta su código.
  5. Si no se encuentra un catch adecuado en el nivel actual de llamadas, la excepción se "propaga" hacia arriba en la pila de llamadas hasta que se encuentre una función de manejo adecuada (o el programa finalice incorrectamente).

Ejemplo:

#include <iostream>
#include <stdexcept> // Para tipos estándar de excepciones

int divide(int a, int b) {
    if (b == 0) {
        throw std::runtime_error("¡División por cero!"); // Generamos una excepción
    }
    return a / b;
}

int main() {
    try {
        int result = divide(10, 0); // Llamamos a una función que puede lanzar una excepción
        std::cout << "Resultado: " << result << std::endl; // Esta línea no se ejecutará
    } catch (const std::runtime_error& e) { // Capturamos la excepción de tipo std::runtime_error
        std::cerr << "Error: " << e.what() << std::endl; // Procesamos la excepción
    } catch (...) { // Captura cualquier otra excepción (punto suspensivo)
        std::cerr << "Ocurrió un error desconocido." << std::endl;
    }

    std::cout << "El programa continúa después del manejo del error." << std::endl;
    return 0;
}

Ventajas:

  • Separación de la lógica y el manejo de errores.
  • Simplificación del flujo principal del código.
  • Capacidad de manejar errores en diferentes niveles de la jerarquía de llamadas.

Desventajas:

  • Puede afectar el rendimiento (debido a la propagación de la pila).
  • Dificultad para entender el flujo de ejecución cuando hay múltiples excepciones.
  • Un uso incorrecto puede llevar a fugas de recursos (si los recursos no se liberan al ocurrir una excepción antes de su liberación correcta).

Para trabajar de manera segura con recursos en presencia de excepciones, a menudo se utilizan RAII (Resource Acquisition Is Initialization) y punteros inteligentes.