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:
- El código que puede causar un error se coloca en el bloque
try. - Si en el bloque
tryocurre una excepción (generada conthrow), la ejecución normal del programa se interrumpe. - El sistema busca un bloque
catchadecuado capaz de manejar la excepción generada (por tipo). - Si se encuentra un
catchcorrespondiente, se ejecuta su código. - Si no se encuentra un
catchadecuado 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.