edubun
한국어

오류 메시지 읽기와 작은 프로젝트

파이썬의 트레이스백은 아래에서부터 읽습니다. 마지막 줄이 오류의 종류이고, 그 위의 코드 줄이 오류가 난 곳입니다.

1947년 작업 일지에 붙은 나방 한 마리

배경1947년, 미국 하버드 대학교에서 Mark II 컴퓨터를 다루던 기술자들이 부품 사이에 끼어 있는 나방 한 마리를 찾아냈습니다. 기술자들은 나방을 작업 일지에 테이프로 붙이고 옆에 「버그가 실제로 발견된 첫 사례(first actual case of bug being found)」라고 적었습니다. 이 일지는 지금 미국 스미스소니언 국립 미국사 박물관에 있습니다. 박물관 설명은 널리 퍼진 이야기 두 가지를 바로잡습니다. 기술자들은 그보다 훨씬 전부터 작은 결함을 「버그」라고 불렀고 토머스 에디슨도 1870년대에 이 말을 썼으니, 나방 때문에 생긴 말이 아닙니다. 이미 있던 말이라서 농담이 되었습니다. 또 그해 Mark II 팀에 있던 그레이스 호퍼가 이 일지를 쓴 사람은 아니었을 것으로 봅니다. 다만 호퍼와 팀원들이 「버그」와 「디버그」라는 말을 프로그래머들 사이에 널리 퍼뜨린 것은 맞다고 적고 있습니다.

요즘 버그 대부분은 코드 속 실수이고, 파이썬은 자기가 알아챌 수 있는 실수를 꽤 친절하게 알려 줍니다. 처음 배우는 사람은 빨간 오류 메시지를 판결문처럼 받아들이지만, 실은 배송 송장에 가깝습니다. 무엇이 잘못됐는지, 몇째 줄인지, 코드의 어느 부분인지가 적혀 있습니다. 어디를 봐야 하는지만 알면 됩니다.

트레이스백은 아래에서 위로 읽습니다

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 zero
1, 2, 3 순서로 읽습니다. 마지막 줄의 오류 종류와 설명, 그다음 파일과 줄 번호, 그다음 표시된 코드 부분입니다.

마지막 줄부터 봅니다. ZeroDivisionError: division by zero는 오류의 종류와 짧은 설명입니다(0으로 나누었다는 뜻입니다). 그다음 위로 올라가 File 줄을 봅니다. 파일 이름(실제 컴퓨터에서는 폴더 경로 전체가 나오는데 여기서는 main.py로 줄였습니다)과 줄 번호 3이 적혀 있습니다. 그 아래 줄은 코드 자체이고, 파이썬 3.12는 실패한 연산 바로 아래, 여기서는 / 기호 밑에 ^ 표시를 해 줍니다. 세 가지를 다 읽은 다음에 고치기 시작하세요. 함수 안에서 오류가 나면 거기까지 이어진 호출이 모두 나열되는데, 보통은 가장 아래쪽 File 줄부터 보면 됩니다.

오류흔한 원인예
SyntaxError파이썬 문법에 맞지 않음. 괄호, 콜론, 따옴표 빠짐print("hi"
IndentationError들여쓰기가 없거나 들쭉날쭉함if x > 1: 다음에 들여 쓴 줄 없음
NameError아직 없는 이름. 오타가 많음pritn("hi")
TypeError자료형이 맞지 않는 연산"Age: " + 15
ValueError자료형은 맞지만 값이 불가능함int("abc")
IndexError리스트나 문자열의 끝을 넘은 인덱스[1, 2][2]
KeyError딕셔너리에 없는 키{"a": 1}["b"]
ZeroDivisionError0으로 나눔5 / 0

SyntaxError(문법 오류)는 나머지와 다릅니다. 파이썬이 실행하기 전에 찾아내기 때문에 첫째 줄조차 실행되지 않고, Traceback 머리말도 없습니다. 나머지 오류는 실행하는 도중에 나는 실행 오류라서, 그 앞 줄들은 이미 실행된 뒤입니다. 어떤 오류가 날 것을 미리 안다면 try와 except로 받아 낼 수 있습니다. 튜토리얼의 오류 장에 나오는 방법으로, 파이썬은 들여 쓴 블록을 실행해 보다가 그 오류가 나면 멈추는 대신 except 블록을 실행합니다.

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)
출력
0

가장 까다로운 버그에는 메시지가 아예 없습니다. 논리 오류는 프로그램이 멀쩡히 실행되면서 틀린 답을 내는 오류입니다. if 단원에서 85점에 C를 준 등급 프로그램이 그런 예입니다. 내가 무엇을 원했는지 파이썬은 알 수 없습니다. 이럴 때는 추적표로 돌아가거나, 단계마다 변수 값을 보여 주는 print를 잠시 넣었다가 버그를 찾은 뒤 지우세요.

작은 프로젝트: 용돈 기입장

이 프로젝트에는 거의 모든 단원의 내용이 들어 있습니다. 쓴 돈을 담은 딕셔너리, 합계를 돌려주는 함수, for 반복문, f-문자열, if입니다. 그대로 쳐서 실행해 본 다음 내 것으로 바꿔 보세요. 항목을 바꾸거나 새 항목을 더해도 되고, 한 항목이 용돈의 절반을 넘으면 경고하게 만들어도 됩니다.

def total(spent):
    t = 0
    for amount in spent.values():
        t += amount
    return t

allowance = 30000
spent = {"떡볶이": 4500, "교통카드 충전": 10000, "공책": 2500}
used = total(spent)
left = allowance - used
for item, amount in spent.items():
    print(f"{item}: {amount}원")
print(f"쓴 돈 {used}원, 남은 돈 {left}원")
if left < 15000:
    print("용돈이 절반도 안 남았습니다")
출력
떡볶이: 4500원
교통카드 충전: 10000원
공책: 2500원
쓴 돈 17000원, 남은 돈 13000원
용돈이 절반도 안 남았습니다

고치기 전에 used와 left의 추적표를 그리고, 6,000원짜리 항목을 하나 더하면 어떻게 될지 먼저 예측해 보세요. 그다음 일부러 버그를 내 봅니다. def 줄 끝의 콜론을 지우고, spent를 한 번 틀리게 쓰고, used를 0으로 나눠 보세요. 고치기 전에 트레이스백을 아래에서부터 읽습니다. 프로그램을 일부러 망가뜨렸다가 다시 고칠 수 있는 힘이 이 과정 전체가 길러 온 힘입니다.

트레이스백파이썬의 오류 보고. 아래에서부터 읽음
SyntaxError(문법 오류)문법에 맞지 않는 코드. 실행 전에 발견됨
NameError없는 이름. 오타인 경우가 많음
TypeError자료형이 맞지 않는 연산
ValueError자료형은 맞지만 불가능한 값. int("abc") 같은 것
논리 오류메시지 없이 실행되지만 답이 틀림
try / except그 오류가 나면 멈추지 않고 except 블록을 실행
  1. 트레이스백에서 오류의 종류가 적힌 줄은?
    • 첫째 줄
    • File 줄
    • 마지막 줄
    • ^ 표시가 있는 줄
  2. int("12a")는 어떤 오류를 낼까요?
    • TypeError
    • ValueError
    • NameError
    • SyntaxError
  3. pritn("hi")는 어떤 오류를 낼까요?
    • SyntaxError
    • NameError
    • TypeError
    • 오류 없음
  4. 프로그램이 첫째 줄을 출력한 뒤 둘째 줄에서 오류로 멈췄습니다. 원인이 될 수 없는 오류는?
    • SyntaxError
    • NameError
    • TypeError
    • ZeroDivisionError
  5. 무엇이 출력될까요?
    try:
        x = 10 / 0
    except ZeroDivisionError:
        x = -1
    print(x)
  6. 실행하면 어떻게 될까요?
    print("start")
    print(5 / 0)
    print("end")
    • start와 end를 출력한다
    • start를 출력한 뒤 ZeroDivisionError로 멈춘다
    • 아무것도 출력하기 전에 ZeroDivisionError로 멈춘다
    • start, inf, end를 출력한다
  7. 프로그램이 아무 메시지 없이 실행되는데 합계가 틀리게 나옵니다. 어떤 오류일까요?
    • SyntaxError
    • 논리 오류
    • NameError
    • IndentationError
  8. 무엇이 출력될까요?
    spent = {"a": 4500, "b": 10000}
    print(30000 - sum(spent.values()))
  9. 아래 결과가 나오도록 작은 프로그램의 줄을 순서대로 놓으세요.
    출력
    80.0
  10. 버그가 어디에 있을까요? def avg(nums): return sum(nums) / len(nums)를 avg([])로 불렀습니다.
    • 빈 리스트의 sum이 오류다
    • len([])이 0이라 0으로 나눈다
    • return에는 나눗셈을 쓸 수 없다
    • 버그가 없다
자주 하는 실수
  • 「오류 메시지가 가리킨 줄만 고치면 된다.」 대개는 맞지만 언제나는 아닙니다. 함수 단원의 x = show_area(4, 3) 다음에 x * 2를 쓰면 x * 2 줄에서 TypeError가 나지만, 진짜 실수는 show_area 안에서 return 대신 쓴 print입니다. 가리킨 줄을 본 다음, 그 줄에 쓰인 값이 어디서 왔는지 거슬러 올라가 보세요.
  • 「전부 try/except로 감싸면 오류가 해결된다.」 오류를 감출 뿐입니다. int(input())의 ValueError처럼 예상한 오류 하나만 받아서 알맞게 처리하세요.
  • 「오류 메시지가 없으면 맞는 프로그램이다.」 논리 오류는 조용히 실행됩니다. 답을 이미 아는 입력, 특히 빈 리스트나 경계 나이 같은 끝 값으로 시험해 보세요.
선생님 메모오류 메시지를 평범한 것으로 만들어 주세요. 고치기 전에 마지막 줄을 소리 내어 읽고, 줄 번호를 말하고, ^ 표시를 손가락으로 짚는 순서를 습관으로 만들면 좋습니다. SyntaxError, NameError, TypeError가 하나씩 들어 있는 망가진 프로그램을 주고 고치게 하는 활동은 수업 시작 5분 활동으로 알맞습니다. 중학교 정보 [9정03-07]은 「프로그램 수행 결과를 디버거로 분석하여 오류를 수정한다」고 되어 있습니다. IDLE의 Debug 메뉴에 간단한 디버거가 있지만, 이 단계에서는 print와 추적표로도 같은 일을 할 수 있습니다. 용돈 기입장 프로젝트는 [9정03-08]의 실생활 문제 해결에 해당하고, 학급 간식비 정산이나 독서 기록장으로 바꿔 내도 됩니다.
핵심 정리
  • 트레이스백은 아래에서부터: 오류 종류, 파일과 줄, 표시된 코드 순서.
  • SyntaxError는 첫 줄 실행 전에 멈추고, 다른 오류는 실행 도중에 멈춤.
  • try/except로 예상한 오류를 처리.
  • 논리 오류는 메시지가 없으니 추적표와 답을 아는 입력으로 시험.
  • 일부러 망가뜨리고 고쳐 보면 오류 메시지가 익숙해짐.
이 과정의 출처 (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)

확인한 날: 2026-10-19