edubun
Español

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

ContextoEn 1947, unos ingenieros que trabajaban en el computador Mark II de la Universidad de Harvard encontraron una polilla atascada en uno de sus componentes. Pegaron el insecto en su cuaderno de registro y escribieron al lado «first actual case of bug being found» (primer caso real de un bicho encontrado). La página está ahora en el Museo Nacional de Historia Americana del Smithsonian. La descripción del propio museo es cuidadosa con dos detalles populares. Los ingenieros llamaban «bugs» a los fallos pequeños mucho antes, y Thomas Edison usó la palabra en la década de 1870, así que la polilla no inventó el término; el chiste funciona porque la palabra ya existía. Y Grace Hopper, que estaba en el equipo del Mark II ese año, probablemente no llevaba ese cuaderno, aunque ella y el equipo ayudaron a que «bug» y «debug» fueran palabras cotidianas para los programadores.

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)
Salida
Traceback (most recent call last):
  File "main.py", line 3, in <module>
    print(total / count)
          ~~~~~~^~~~~~~
ZeroDivisionError: division by zero
Léelo en el orden 1, 2, 3: el tipo de error y el mensaje en la última línea, luego el archivo y el número de línea, luego la parte marcada del código.

Empieza 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.

ErrorCausa habitualEjemplo
SyntaxErrorLa línea no es Python válido: falta un paréntesis, dos puntos o una comillaprint("hi"
IndentationErrorSangría ausente o desparejaif x > 1: sin ninguna línea con sangría
NameErrorUn nombre que aún no existe, a menudo un error de escriturapritn("hi")
TypeErrorUna operación con el tipo equivocado"Age: " + 15
ValueErrorTipo correcto, valor imposibleint("abc")
IndexErrorÍndice más allá del final de una lista o cadena[1, 2][2]
KeyErrorClave que no está en el diccionario{"a": 1}["b"]
ZeroDivisionErrorDivisión entre cero5 / 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")
Salida
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)
Salida
0

Los 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")
Salida
snacks: 4500 won
bus card: 10000 won
notebook: 2500 won
Spent 17000, left 13000
Less than half left

Antes 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.

tracebackEl informe de errores de Python; léelo de abajo hacia arriba
SyntaxErrorCódigo no válido, encontrado antes de ejecutar nada
NameErrorUn nombre que no existe, a menudo un error de escritura
TypeErrorUna operación con un valor del tipo equivocado
ValueErrorEl tipo correcto con un valor imposible, como int("abc")
error de lógicaSe ejecuta sin mensaje pero da la respuesta equivocada
try / exceptEjecuta el bloque except en lugar de detenerse cuando ocurre ese error
  1. ¿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 ^
  2. ¿Qué error causa int("12a")?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. ¿Qué error causa pritn("hi")?
    • SyntaxError
    • NameError
    • TypeError
    • Ningún error
  4. 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
  5. ¿Qué imprime esto?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. ¿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
  7. 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
  8. ¿Qué imprime esto?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. Pon las líneas de este programa pequeño en orden para que imprima el resultado de abajo.
    Salida
    80.0
  10. ¿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
Errores frecuentes
  • «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.
Nota para docentesHaz que los mensajes de error sean algo ordinario. Una buena rutina: antes de arreglar nada, el estudiante lee en voz alta la última línea, luego dice el número de línea y luego señala las marcas ^. Los programas rotos a propósito (un SyntaxError, un NameError, un TypeError) sirven de calentamiento rápido. El currículo coreano de informática de secundaria pide analizar resultados con un depurador y corregir errores; IDLE tiene uno sencillo en el menú Debug, pero las líneas print y las tablas de seguimiento hacen el mismo trabajo en este nivel. El proyecto del dinero de bolsillo encaja con el siguiente estándar, resolver un problema de la vida real con un programa, y puede adaptarse a un presupuesto de golosinas de la clase o a un registro de lectura.
Ideas clave
  • 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