Módulo 0 · Lección 7 de 8
Entender los errores
Cómo se lee un mensaje de error de Python, qué significan los tipos más frecuentes y qué hacer paso a paso cuando algo falla.
Vas a ver muchísimos errores. No son un síntoma de que lo estés haciendo mal: son la forma que tiene Python de explicarte qué ha encontrado raro. Quien programa bien no es quien no comete errores, sino quien los lee rápido y los arregla.
Anatomía de un error#
Ejecuta este programa, que falla a propósito:
numeros = [10, 20, 30]
print(numeros[5])Traceback (most recent call last):
File "/Users/erwin/curso-python/fallo.py", line 2, in <module>
print(numeros[5])
~~~~~~~^^^
IndexError: list index out of rangeParece intimidante, pero son solo cuatro piezas:
Traceback (most recent call last). Una etiqueta fija que anuncia "aquí viene el recorrido del error". Ignórala.File ... line 2. Dónde ha ocurrido: el fichero y, sobre todo, la línea. Este es el dato que más rápido te lleva al problema.- La línea de código y los símbolos
~~~^^^. Python te reproduce la línea culpable y te señala con acentos circunflejos el trozo exacto que ha fallado. - La última línea:
IndexError: list index out of range. El tipo de error y su explicación. Es lo más importante del mensaje entero.
Los errores que más vas a ver#
SyntaxError#
Has escrito algo que no es Python válido. El intérprete ni siquiera llega a ejecutar el programa.
print("hola"SyntaxError: '(' was never closedCausas típicas: un paréntesis o una comilla sin cerrar, dos puntos olvidados al final de un if, o un = donde hacía falta ==. Mira también la línea anterior a la que te señala, porque un paréntesis abierto se arrastra hacia abajo.
NameError#
Usas un nombre que Python no conoce.
mensaje = "hola"
print(mensage)NameError: name 'mensage' is not defined. Did you mean: 'mensaje'?Casi siempre es una errata o una mayúscula de más. Python moderno hasta te sugiere el nombre parecido.
TypeError#
Estás mezclando cosas que no se pueden mezclar.
edad = 30
print("Tengo " + edad + " años")TypeError: can only concatenate str (not "int") to strSumar un texto con un número no significa nada para Python. La solución la verás en el módulo de fundamentos: convertir el número a texto con str(edad), o usar cadenas formateadas.
IndentationError#
Los espacios del principio de la línea no cuadran.
if True:
print("dentro")IndentationError: expected an indented block after 'if' statement on line 1Después de un : la línea siguiente debe ir desplazada a la derecha. Mezclar tabuladores y espacios provoca el mismo error, aunque a la vista todo parezca alineado: configura tu editor para usar solo espacios.
ValueError#
El tipo de dato es correcto, pero el valor concreto no sirve.
numero = int("hola")ValueError: invalid literal for int() with base 10: 'hola'int() acepta textos, pero solo si contienen un número. Este error aparece muchísimo cuando pides datos al usuario y escribe cualquier cosa.
ModuleNotFoundError#
Intentas usar algo que no está instalado.
import djangoModuleNotFoundError: No module named 'django'Se arregla instalándolo con pip install django. En los módulos de Django y APIs lo veremos junto con los entornos virtuales, que es donde esto se complica y se explica bien.
El error silencioso#
Hay un fallo peor que todos los anteriores: el programa funciona pero da un resultado equivocado. No hay traceback, no hay pista.
total = 10 + 5
promedio = total / 3
print("El promedio es", promedio)Se ejecuta sin quejarse, pero si los números eran dos y no tres, el resultado está mal. Para estos casos la herramienta es print: escribe valores intermedios en pantalla y comprueba si son los que esperabas.
total = 10 + 5
print("total vale:", total)
promedio = total / 3
print("promedio vale:", promedio)Se llama depurar con prints, es lo que hace todo el mundo y no es ninguna vergüenza.
Qué hacer cuando te atascas#
Sigue este orden, sin saltarte pasos:
- Lee la última línea del error entera. No la mitad: entera.
- Ve a la línea que te indica y mírala con calma, junto a la anterior.
- Comprueba lo obvio: comillas y paréntesis cerrados, dos puntos al final, mayúsculas correctas, sangría consistente.
- Imprime los valores de las variables implicadas para ver qué contienen de verdad.
- Reduce el programa hasta el trozo mínimo que falla. A menudo, al hacerlo, encuentras el fallo tú solo.
- Busca el mensaje en internet, copiando el tipo de error y el texto, pero quitando tus nombres de fichero y de variables.