El manejo de excepciones es una característica fundamental en C++ que permite a los programadores gestionar errores y condiciones excepcionales de manera controlada. En este módulo, aprenderemos cómo utilizar las excepciones para mejorar la robustez y la fiabilidad de nuestros programas.
Conceptos Clave
- Excepción: Un evento que ocurre durante la ejecución de un programa y que interrumpe el flujo normal de las instrucciones.
- Lanzar (throw): La acción de generar una excepción.
- Capturar (catch): La acción de manejar una excepción lanzada.
- Bloque try: Un bloque de código que contiene instrucciones que pueden lanzar excepciones.
- Bloque catch: Un bloque de código que maneja las excepciones lanzadas en el bloque try.
Estructura Básica del Manejo de Excepciones
La estructura básica para el manejo de excepciones en C++ incluye los bloques try
, throw
y catch
. A continuación se muestra un ejemplo simple:
#include <iostream> using namespace std; int main() { try { // Bloque de código que puede lanzar una excepción int divisor = 0; if (divisor == 0) { throw "División por cero no permitida"; } int result = 10 / divisor; cout << "Resultado: " << result << endl; } catch (const char* e) { // Bloque de código que maneja la excepción cout << "Error: " << e << endl; } return 0; }
Explicación del Código
- Bloque try: Contiene el código que puede lanzar una excepción. En este caso, estamos verificando si el divisor es cero antes de realizar una división.
- throw: Si el divisor es cero, lanzamos una excepción con el mensaje "División por cero no permitida".
- Bloque catch: Captura la excepción lanzada y maneja el error imprimiendo un mensaje.
Tipos de Excepciones
En C++, se pueden lanzar y capturar diferentes tipos de excepciones, incluyendo tipos básicos como int
, char
, double
, y tipos definidos por el usuario como clases y estructuras.
Ejemplo con Diferentes Tipos de Excepciones
#include <iostream> using namespace std; void checkNumber(int num) { if (num < 0) { throw num; // Lanza una excepción de tipo int } else if (num == 0) { throw "Número es cero"; // Lanza una excepción de tipo const char* } else if (num > 100) { throw 1.0; // Lanza una excepción de tipo double } } int main() { try { checkNumber(150); } catch (int e) { cout << "Error: Número negativo " << e << endl; } catch (const char* e) { cout << "Error: " << e << endl; } catch (double e) { cout << "Error: Número mayor que 100" << endl; } return 0; }
Explicación del Código
- checkNumber: Función que lanza diferentes tipos de excepciones basadas en el valor del argumento
num
. - Bloques catch: Capturan y manejan las excepciones de diferentes tipos (
int
,const char*
,double
).
Ejercicio Práctico
Ejercicio 1: Manejo de Excepciones en una Calculadora
Escribe un programa que implemente una calculadora simple que maneje excepciones para las siguientes operaciones: suma, resta, multiplicación y división. El programa debe lanzar una excepción si se intenta dividir por cero.
Solución
#include <iostream> using namespace std; double calculate(double a, double b, char op) { switch (op) { case '+': return a + b; case '-': return a - b; case '*': return a * b; case '/': if (b == 0) { throw "División por cero no permitida"; } return a / b; default: throw "Operador no válido"; } } int main() { double num1, num2; char op; cout << "Ingrese dos números y un operador (+, -, *, /): "; cin >> num1 >> num2 >> op; try { double result = calculate(num1, num2, op); cout << "Resultado: " << result << endl; } catch (const char* e) { cout << "Error: " << e << endl; } return 0; }
Explicación del Código
- calculate: Función que realiza la operación aritmética basada en el operador proporcionado. Lanza excepciones si se intenta dividir por cero o si se proporciona un operador no válido.
- Bloque try: Llama a la función
calculate
y maneja cualquier excepción lanzada. - Bloque catch: Captura y maneja las excepciones lanzadas por la función
calculate
.
Resumen
En esta sección, hemos aprendido los conceptos básicos del manejo de excepciones en C++, incluyendo cómo lanzar y capturar excepciones utilizando los bloques try
, throw
y catch
. También hemos visto ejemplos prácticos y un ejercicio para reforzar los conceptos aprendidos. El manejo adecuado de excepciones es crucial para escribir programas robustos y fiables, y es una habilidad esencial para cualquier programador de C++.
Curso de Programación en C++
Módulo 1: Introducción a C++
- Introducción a C++
- Configuración del Entorno de Desarrollo
- Sintaxis y Estructura Básica
- Variables y Tipos de Datos
- Entrada y Salida
Módulo 2: Estructuras de Control
Módulo 3: Funciones
- Introducción a las Funciones
- Parámetros de Función y Tipos de Retorno
- Sobrecarga de Funciones
- Recursión
Módulo 4: Arreglos y Cadenas
- Introducción a los Arreglos
- Arreglos Multidimensionales
- Introducción a las Cadenas
- Manipulación de Cadenas
Módulo 5: Punteros y Referencias
- Introducción a los Punteros
- Aritmética de Punteros
- Punteros y Arreglos
- Referencias
- Asignación Dinámica de Memoria
Módulo 6: Programación Orientada a Objetos
- Introducción a la POO
- Clases y Objetos
- Constructores y Destructores
- Herencia
- Polimorfismo
- Encapsulación y Abstracción
Módulo 7: Temas Avanzados
- Plantillas
- Manejo de Excepciones
- Entrada/Salida de Archivos
- Biblioteca Estándar de Plantillas (STL)
- Expresiones Lambda
- Multihilo