¿Qué es el manejo de excepciones?
El manejo de excepciones es la forma en que un programa responde a los errores que ocurren mientras se ejecuta. El código que puede fallar va en un bloque protegido, como try, y cuando se lanza un error, el control salta a un manejador, como except o catch, en lugar de que el programa se detenga.
Actualizado el 24 de septiembre de 2026
Un programa que pide la edad a la gente recibirá tarde o temprano "twenty" en lugar de 20. Convertir ese texto es un error en tiempo de ejecución: int("twenty") lanza ValueError y, sin un plan para ello, el programa se detiene. El manejo de excepciones es ese plan. Marcas el código que puede fallar y escribes el código que se ejecuta si falla.
Next year you will be 35
Not a number: twenty
Next year you will be 20
Done
La respuesta mala se notifica y el bucle sigue con la siguiente. Sin el try, el programa habría impreso una línea y después un traceback.
Cómo funciona el manejo de excepciones
- El código dentro de
tryse ejecuta con normalidad. - Una operación falla y el runtime lanza una excepción: un objeto con un tipo (
ValueError) y un mensaje (invalid literal for int() with base 10: 'twenty'). - El bloque
tryse detiene en esa línea. Sus líneas restantes se saltan, y por eso "Next year you will be" no se imprime para "twenty". - El runtime compara el tipo de la excepción con cada cláusula
except, de arriba abajo, y ejecuta la primera que coincide. - Cuando el manejador termina, el programa continúa en la primera línea después de toda la instrucción
try. - Si ninguna cláusula coincide, la excepción sale de la función actual y la búsqueda continúa en la función que la llamó, y luego en la que llamó a esa. A esto se le llama deshacer la pila de llamadas. Si la búsqueda llega a lo más alto del programa sin coincidencia, el programa termina con un traceback.
El paso 6 significa que el manejador no tiene que estar en la función donde ocurre el error. Aquí el fallo está dos llamadas más abajo y el manejador del final lo captura igualmente:
parsing 4.50
parsing free
Could not add the prices: could not convert string to float: 'free'
float("free") falló dentro de parse_price. Ni parse_price ni total tenían manejador, así que ambas se abandonaron, y "3.20" nunca se llegó a analizar. Esta es la principal decisión de diseño que te da el manejo de excepciones: manejar un error donde sabes qué hacer con él, que muchas veces está lejos de donde ocurrió.
try, except, else y finally
La instrucción try de Python tiene dos partes opcionales más. else se ejecuta solo cuando el bloque try terminó sin excepción. finally se ejecuta en todos los casos: tras un éxito, tras una excepción manejada e incluso cuando la función retorna desde dentro del try.
no error
finally runs either way
2.0
b was zero
finally runs either way
None
En finally va la limpieza: cerrar un archivo, liberar un lock, cerrar una conexión a la base de datos. En Python, la instrucción with hace esta limpieza automáticamente con los archivos, y es la opción habitual para ellos.
Lanzar tus propias excepciones
Las excepciones no son solo para los errores que detecta el lenguaje. Cuando tu propia función recibe una entrada con la que no puede trabajar, puede lanzar una excepción para rechazarla, y quien la llamó decide qué pasa después. Definir una pequeña clase de excepción le da al error un nombre que lo describe.
70
Refused: cannot take 250, balance is 100
Python usa raise. Java, C++ y JavaScript usan throw para lo mismo.
El manejo de excepciones en otros lenguajes
| Lenguaje | Palabras clave | Conviene saber |
|---|---|---|
| Python | try, except, else, finally, raise | Toda excepción es un objeto que hereda de BaseException |
| Java | try, catch, finally, throw, throws | Las excepciones comprobadas como IOException deben capturarse o declararse con throws |
| C++ | try, catch, throw | No hay finally; los destructores limpian mientras se deshace la pila |
| JavaScript | try, catch, finally, throw | Los errores en código async se capturan con un try alrededor de await |
| C | ninguna | Las funciones devuelven un código de error, y muchas ponen un valor en errno |
| Go | ninguna para los errores normales | Las funciones devuelven un valor error que comprueba quien las llama |
El mismo ejemplo de conversión en Java queda así:
try {
int age = Integer.parseInt("twenty");
System.out.println(age + 1);
} catch (NumberFormatException e) {
System.out.println("Not a number: " + e.getMessage());
} finally {
System.out.println("done");
}
Java divide las excepciones en dos grupos. Las excepciones comprobadas (checked), como IOException, describen problemas fuera del control del programa, y el compilador se niega a compilar el código que ni las captura ni las declara. Las excepciones no comprobadas (unchecked), subclases de RuntimeException como NullPointerException, suelen indicar un bug, y el compilador no te obliga a manejarlas.
Errores comunes
- Capturarlo todo. Un
except:a secas en Python también capturaKeyboardInterrupt, así que Ctrl+C deja de funcionar, yexcept Exception:captura bugs que nunca previste. Captura el tipo concreto que sabes manejar. - Tragarse el error.
except ValueError: passoculta el problema. Como mínimo, imprime o registra lo que salió mal. - Un bloque
trydemasiado grande. Envuelve solo las líneas que pueden lanzar la excepción que capturas, para no manejar por accidente un error que no tiene nada que ver. - Capturar bugs en vez de corregirlos. Un
IndexErrorde un bucle que da un paso de más es un fallo del código. Manejarlo mantiene vivo el código incorrecto. - Esperar que
catchevite un fallo en C o C++. Un segmentation fault es una señal del sistema operativo, no una excepción, y en Linux y macOS uncatch (...)de C++ nunca la ve.
Qué leer después
Los errores a los que responde el manejo de excepciones se describen en la página de error en tiempo de ejecución, y el fallo que no puede capturar, en la página de segmentation fault. Para la sintaxis completa, lee las guías de excepciones en Python, try y catch en Java, excepciones en C++ y try y catch en JavaScript. El curso de Java y el curso de Python los practican con ejercicios reales.
Preguntas frecuentes
¿Cuáles son las 5 palabras clave del manejo de excepciones en Java?
try, catch, finally, throw y throws. try marca el código que se vigila, catch maneja un tipo de excepción concreto y finally ejecuta código de limpieza tanto si hubo excepción como si no. throw lanza una excepción, y throws en la firma de un método declara qué excepciones comprobadas puede pasar el método a quien lo llama.¿Cómo es el manejo de excepciones en C++?
try, catch y throw. Se puede lanzar cualquier tipo, pero por convención se lanza un objeto derivado de std::exception, como std::runtime_error, y se captura por referencia: catch (const std::exception& e). C++ no tiene finally; la limpieza ocurre en los destructores, que se ejecutan solos mientras se deshace la pila.¿Qué diferencia hay entre un error y una excepción?
Exception cubre los problemas que un programa puede manejar razonablemente, mientras que Error, como OutOfMemoryError o StackOverflowError, indica un fallo de la JVM que normalmente un programa no debería intentar capturar. En Python, ValueError y ZeroDivisionError son ambas excepciones a pesar de su nombre.¿Qué diferencia hay entre throw y throws en Java?
throw es una instrucción que lanza una excepción en ese punto: throw new IllegalArgumentException("negative age");. throws forma parte de la declaración de un método y enumera las excepciones comprobadas que el método puede pasar a quien lo llama: void load() throws IOException. Entonces el compilador obliga a cada llamador a capturar esa excepción o a declararla también.¿El manejo de excepciones hace el código más lento?
try es barato en la mayoría de los lenguajes modernos. Desde Python 3.11, un try no cuesta casi nada cuando no se lanza ninguna excepción, y los principales compiladores de C++ no añaden coste en tiempo de ejecución al camino en el que no se lanza nada. Lanzar y capturar una excepción es mucho más lento que una comprobación con if, así que en bucles donde el rendimiento es crítico, comprueba los casos comunes en lugar de depender de excepciones.