La palabra clave 'throw'
Parte de la sección Lógica y Flujo del Journey de C++ de Coddy. Lección 50 de 56.
A veces necesitas indicar que se ha producido un error en tu propio código, en lugar de limitarte a capturar las excepciones lanzadas por otras funciones. La palabra clave throw te permite activar manualmente una excepción cuando tu programa detecta un problema.
Puedes lanzar distintos tipos de valores como excepciones: enteros, cadenas o incluso objetos personalizados. Esta es la sintaxis básica:
if (someErrorCondition) {
throw "Error message"; // Lanza un literal de cadena
}Cuando usas throw, el programa deja de ejecutar inmediatamente la función actual y busca un bloque catch que pueda manejar el valor lanzado. Esto resulta especialmente útil para validar la entrada o comprobar condiciones que no deberían darse durante la ejecución normal del programa.
Aquí tienes un ejemplo práctico de cómo lanzar una excepción al detectar una entrada no válida:
void checkAge(int age) {
if (age < 0) {
throw "Age cannot be negative!";
}
std::cout << "Age is valid: " << age << std::endl;
}Quien realiza la llamada envuelve la llamada en un bloque try. Una cadena literal lanzada tiene el tipo const char*, así que ese es el tipo que especifica el bloque catch, y su parámetro contiene el mensaje:
try {
checkAge(-5);
} catch (const char* message) {
std::cout << "Error: " << message << std::endl;
}
// Salida: Error: ¡La edad no puede ser negativa!La palabra clave throw te permite controlar cuándo y cómo se notifican los errores en tus programas, lo que hace que tus funciones sean más sólidas y predecibles al tratar con condiciones no válidas.
Desafío
FácilCrea un programa que implemente la validación de entradas usando la palabra clave throw para lanzar excepciones manualmente cuando se detecten condiciones no válidas. Este desafío pondrá a prueba tu comprensión de cómo usar throw para señalar errores en tus propias funciones.
Se proporcionarán las siguientes entradas:
- Una cadena
usernameque representa el nombre de usuario elegido por una persona (esta línea puede estar vacía) - Un entero
ageque representa la edad de la persona
Tu programa debe:
- Crear una función llamada
validateUserque reciba una cadena y un entero como parámetros - Dentro de la función, comprobar si el nombre de usuario está vacío (tiene una longitud de 0)
- Si el nombre de usuario está vacío, lanzar con
throwla cadena"Username cannot be empty" - Comprobar si la edad es menor que 13
- Si la edad es menor que 13, lanzar con
throwla cadena"Age must be at least 13" - Si ambas validaciones se superan, imprimir
"User validation successful" - En la función principal, llamar a
validateUsercon los valores de entrada - Usar un bloque
trypara llamar a la función y un bloquecatchpara gestionar cualquier excepción de cadena lanzada
Usa el siguiente formato de salida exacto:
Si la validación se completa correctamente:
User validation successfulSi hay errores de validación:
Validation error: [error_message]Recuerda que, cuando usas throw, el programa deja de ejecutar inmediatamente la función actual y busca un bloque catch coincidente. El bloque catch debe especificar el tipo const char* para gestionar los literales de cadena lanzados. Si falla la primera validación, la función lanzará una excepción y no continuará comprobando la segunda condición.
Pruébalo tú mismo
#include <iostream>
#include <string>
using namespace std;
// TODO: Escribe la función validateUser aquí, encima de main
// Recibe un username de tipo string y un age de tipo int, y lanza un literal de cadena cuando falla una comprobación
int main() {
// Lee la entrada
string username;
int age;
getline(cin, username);
cin >> age;
// TODO: Llama a validateUser dentro de un bloque try
// y captura el mensaje lanzado con catch (const char* error)
return 0;
}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
1Punteros y memoria
¿Qué es un puntero?Operador de direcciónOperador de desreferenciaPunteros nulosPunteros y arraysMemoria dinámica con 'new'Liberar memoria con 'delete'Resumen: Práctica de punteros2Vectores (Arrays dinámicos)
Introducción a std::vectorCreación de un VectorAgregar elementosAcceder a los elementosTamaño del VectorIterar con un bucle ForBucle For basado en rangosEliminar elementosResumen - Operaciones con Vectores5Proyecto: Herramienta de inventario
Configuración del proyectoAgregar y actualizar artículos8Manejo básico de errores
Introducción a las excepcionesLos bloques 'try' y 'catch'La palabra clave 'throw'Diferentes tipos de excepcionesEl manejador genérico (catch-all)Repaso: División segura3Proyecto: Herramienta de lista de tareas
Descripción general del proyectoAñadir una tareaPractica por tu cuenta: Compilador de C++ online