Leer mensajes de error y un proyecto pequeño
Un traceback de Python se lee desde abajo: la última línea nombra el error, y la indicación encima del código muestra el archivo y el número de línea.
Una polilla pegada en un cuaderno de registro en 1947
Hoy la mayoría de los errores son fallos en el código, y Python es bueno para avisarte de los que puede detectar. Los principiantes suelen ver un error en rojo como un veredicto. Se parece más a una nota de entrega: qué salió mal, en qué línea y en qué parte del código. El truco es saber dónde mirar.
Lee un traceback de abajo hacia arriba
total = 0
count = 0
print(total / count)Traceback (most recent call last):
File "main.py", line 3, in <module>
print(total / count)
~~~~~~^~~~~~~
ZeroDivisionError: division by zeroEmpieza por la última línea. ZeroDivisionError: division by zero da el tipo de error y una explicación breve. Luego sube a la línea File: el nombre del archivo (en tu computadora aparece ahí la ruta completa de carpetas; aquí está abreviada a main.py) y el número de línea, 3. La línea de abajo es el código mismo, y Python 3.12 marca la operación exacta que falló con ^ bajo el signo /. Solo después de leer las tres cosas deberías empezar a cambiar algo. Cuando el error ocurre dentro de una función, el traceback enumera cada llamada hasta llegar ahí, y la línea File más baja suele ser la que conviene mirar primero.
| Error | Causa habitual | Ejemplo |
|---|---|---|
| SyntaxError | La línea no es Python válido: falta un paréntesis, dos puntos o una comilla | print("hi" |
| IndentationError | Sangría ausente o despareja | if x > 1: sin ninguna línea con sangría |
| NameError | Un nombre que aún no existe, a menudo un error de escritura | pritn("hi") |
| TypeError | Una operación con el tipo equivocado | "Age: " + 15 |
| ValueError | Tipo correcto, valor imposible | int("abc") |
| IndexError | Índice más allá del final de una lista o cadena | [1, 2][2] |
| KeyError | Clave que no está en el diccionario | {"a": 1}["b"] |
| ZeroDivisionError | División entre cero | 5 / 0 |
Un SyntaxError es distinto de los demás. Python lo encuentra antes de ejecutar nada, así que ni siquiera se ejecuta la línea 1, y no hay encabezado «Traceback». Todos los demás ocurren mientras el programa se ejecuta, después de que las líneas anteriores ya hicieron su trabajo. Cuando esperas un error concreto, puedes capturarlo con try y except, que el tutorial trata en su capítulo sobre errores: Python intenta el bloque con sangría, y si ocurre ese error, ejecuta el bloque except en lugar de detenerse.
print("before")
n = int("abc")
print("after")before
Traceback (most recent call last):
File "main.py", line 2, in <module>
n = int("abc")
^^^^^^^^^^
ValueError: invalid literal for int() with base 10: 'abc'text = "abc"
try:
n = int(text)
except ValueError:
n = 0
print(n)0Los errores más difíciles no dan ningún mensaje. Con un error de lógica, el programa se ejecuta pero imprime la respuesta equivocada, como el programa de calificaciones de la unidad sobre if que dio una C a 85. Python no puede saber qué querías decir. Para estos, vuelve a la tabla de seguimiento, o agrega líneas print temporales que muestren las variables en cada paso, y quítalas cuando encuentres el error.
Proyecto pequeño: un registro de dinero de bolsillo
El proyecto usa algo de casi todas las unidades: un diccionario de gastos, una función que devuelve un total, un bucle for, una f-string y un if. Escríbelo, ejecútalo y luego hazlo tuyo: cambia los artículos, agrega una categoría o avisa cuando un solo artículo cueste más de la mitad de la mesada.
def total(spent):
t = 0
for amount in spent.values():
t += amount
return t
allowance = 30000
spent = {"snacks": 4500, "bus card": 10000, "notebook": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
print(f"{item}: {amount} won")
print(f"Spent {used}, left {left}")
if left < 15000:
print("Less than half left")snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half leftAntes de cambiarlo, escribe una tabla de seguimiento de used y left, y predice qué pasa si agregas un artículo de 6000 wones. Luego provoca errores deliberadamente: borra los dos puntos después de la línea def, escribe mal spent una vez y divide used entre cero. Lee cada traceback de abajo hacia arriba antes de corregirlo. Poder romper un programa y arreglarlo de nuevo es la habilidad real que ha ido construyendo este curso.
| traceback | El informe de errores de Python; léelo de abajo hacia arriba |
| SyntaxError | Código no válido, encontrado antes de ejecutar nada |
| NameError | Un nombre que no existe, a menudo un error de escritura |
| TypeError | Una operación con un valor del tipo equivocado |
| ValueError | El tipo correcto con un valor imposible, como int("abc") |
| error de lógica | Se ejecuta sin mensaje pero da la respuesta equivocada |
| try / except | Ejecuta el bloque except en lugar de detenerse cuando ocurre ese error |
- ¿Qué línea de un traceback nombra el tipo de error?
- La primera línea
- La línea File
- La última línea
- La línea con las marcas ^
- ¿Qué error causa
int("12a")?- TypeError
- ValueError
- NameError
- SyntaxError
- ¿Qué error causa
pritn("hi")?- SyntaxError
- NameError
- TypeError
- Ningún error
- Un programa imprime la línea 1 y luego se detiene con un error en la línea 2. ¿Qué tipo de error no puede ser la causa?
- SyntaxError
- NameError
- TypeError
- ZeroDivisionError
- ¿Qué imprime esto?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - ¿Qué pasa al ejecutar esto?
print("start") print(5 / 0) print("end")- Imprime start y end
- Imprime start y luego se detiene con ZeroDivisionError
- Se detiene con ZeroDivisionError antes de imprimir nada
- Imprime start, inf y end
- Un programa se ejecuta sin ningún mensaje pero imprime un total equivocado. ¿Qué tipo de error es ese?
- SyntaxError
- Error de lógica
- NameError
- IndentationError
- ¿Qué imprime esto?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - Pon las líneas de este programa pequeño en orden para que imprima el resultado de abajo.Salida
80.0 - ¿Dónde está el error? def avg(nums): return sum(nums) / len(nums), llamada con avg([]).
- sum de una lista vacía es un error
- len([]) es 0, así que divide entre cero
- return no puede contener una división
- No hay ningún error
- «El error está en la línea que nombra el mensaje, así que la corrección va ahí». A menudo, pero no siempre. En la unidad de funciones, x = show_area(4, 3) seguido de x * 2 se detiene con un TypeError en la línea x * 2, pero el error real es el print dentro de show_area, que debió ser un return. Lee la línea nombrada y pregunta de dónde vinieron sus valores.
- «Envolverlo todo en try/except arregla los errores». Solo los oculta. Captura un error concreto que esperes, como ValueError de int(input()), y trátalo de una manera que tenga sentido.
- «Que no haya mensaje de error significa que el programa es correcto». Los errores de lógica se ejecutan en silencio. Prueba con entradas cuya respuesta ya conoces, incluidos casos límite como una lista vacía o una edad en el límite.
- Lee un traceback de abajo hacia arriba: tipo de error, luego archivo y línea, luego el código marcado.
- Un SyntaxError detiene el programa antes de que se ejecute la línea 1; los otros errores lo detienen a medias.
- try/except maneja un error que esperas.
- Los errores de lógica no dan mensaje: sigue el programa y prueba con respuestas conocidas.
- Depurar es romper y arreglar a propósito hasta que los mensajes se vuelvan algo ordinario.
Fuentes de este curso (6)
- Python Software Foundation, The Python Tutorial for Python 3.12 (docs.python.org/3.12/tutorial: 2 Using the Python Interpreter, 3 An Informal Introduction to Python (numbers, text, lists), 4 More Control Flow Tools (if, for, range, break and continue, defining functions, default argument values, 4.10 coding style: 4-space indentation), 5 Data Structures (list methods, 5.5 dictionaries, insertion order), 8 Errors and Exceptions (syntax errors, exceptions, reading the traceback, handling exceptions), 15 Floating-Point Arithmetic (0.1 + 0.2))
- Built-in Functions (docs.python.org/3.12/library/functions.html: print, input, len, int, float, str, type, round (round half to even: round(0.5) and round(-0.5) are 0, round(1.5) is 2), range, sum, min, max, sorted)
- Built-in Types (str methods upper, lower, replace, strip; dict.get; list.append, pop, remove, sort returning None)
- General Python FAQ (docs.python.org/3.12/faq/general.html: Guido van Rossum began Python in the 1989 Christmas holidays, posted it to USENET in February 1991, named it after Monty Python's Flying Circus)
- Curriculum for the Korean pages: 교육부 고시 제2022-33호 [별책 10] 정보과 교육과정 (PDF read 2026-10-19: 중학교 정보 [9정03-05] 리스트 등 데이터를 순차적으로 저장하는 구조, [9정03-06] 논리 연산과 중첩 제어 구조, [9정03-07] 함수 활용과 디버거로 오류 수정, [9정03-08] 실생활 문제를 프로그래밍으로 해결, 적용 시 고려 사항 「학생의 수준을 고려하여 적합한 프로그래밍 언어를 선정」; 고등학교 정보 [12정03-04] 자료형, [12정03-05] 표준입출력, [12정03-07] 제어 구조)
- Bug story only: Smithsonian National Museum of American History, Log Book With Computer Bug, 1947, Harvard Mark II, "first actual case of bug being found", probably not Hopper's log book (americanhistory.si.edu/collections/object/nmah_334663, read 2026-10-19)
Fecha de consulta: 2026-10-19