Ir al contenido

throw y try-catch

Delegación del manejo de excepciones con throw y throws

Sección titulada «Delegación del manejo de excepciones con throw y throws»

En algunas ocasiones, un método puede incorporar validaciones internas para determinar si es posible continuar con una operación.
Si durante esa validación se detecta una condición inválida no se está obligado a manejar el error en ese mismo método. En su lugar, se puede optar por lanzar una excepción utilizando throw y declarar que el método puede generar esta mediante la palabra clave throws. Esto permite que la responsabilidad de manejar la excepción sea delegada al método que lo invocó.

throws: Palabra clave en Java que se utiliza en la firma del método para declarar que dicho método puede lanzar una o más excepciones, sin encargarse de manejarlas directamente.

Este enfoque de delegación es especialmente útil en los siguientes casos:

  • Cuando el método que detecta la excepción no cuenta con el contexto suficiente para decidir cómo actuar frente al error.
  • Cuando se desea mantener el método enfocado exclusivamente en su función principal, como validar, transformar o calcular sin contaminar su lógica con decisiones de control de errores.

A este método que realiza la llamada se le conoce como el llamador o método invocador, y tiene dos formas posibles de actuar frente a la excepción delegada:

  • Capturarla localmente utilizando un bloque try-catch, gestionando así la situación de forma controlada.
  • Declarar a su vez que puede lanzarla, usando throws, permitiendo que otro método superior en la cadena de llamadas tome la decisión.

Ejemplo: lanzar con throw y capturar con try-catch

Sección titulada «Ejemplo: lanzar con throw y capturar con try-catch»
// Método que lanza manualmente una excepción
public void validarEdad(int edad) throws IllegalArgumentException {
if (edad < 0) {
throw new IllegalArgumentException("Edad no válida: no puede ser negativa.");
}
}
// Método llamador que decide cómo manejar el error
public void registrarUsuario(String nombre, int edad) {
try {
validarEdad(edad); // se lanza la excepción si la edad es inválida
System.out.println("Usuario registrado con éxito.");
} catch (IllegalArgumentException e) {
System.out.println("Error al registrar usuario: " + e.getMessage());
}
}
  • validarEdad detecta una condición inválida (edad negativa) y lanza una excepción con throw.
  • Declara en su firma throws IllegalArgumentException, avisando que no la maneja.
  • registrarUsuario es el método que llama a validarEdad.
  • Este sí tiene el contexto suficiente (interacción con el usuario) y por eso captura la excepción con try-catch y muestra un mensaje adecuado.