오류 메시지 읽기와 작은 프로젝트
파이썬의 트레이스백은 아래에서부터 읽습니다. 마지막 줄이 오류의 종류이고, 그 위의 코드 줄이 오류가 난 곳입니다.
1947년 작업 일지에 붙은 나방 한 마리
요즘 버그 대부분은 코드 속 실수이고, 파이썬은 자기가 알아챌 수 있는 실수를 꽤 친절하게 알려 줍니다. 처음 배우는 사람은 빨간 오류 메시지를 판결문처럼 받아들이지만, 실은 배송 송장에 가깝습니다. 무엇이 잘못됐는지, 몇째 줄인지, 코드의 어느 부분인지가 적혀 있습니다. 어디를 봐야 하는지만 알면 됩니다.
트레이스백은 아래에서 위로 읽습니다
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마지막 줄부터 봅니다. 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"] |
| ZeroDivisionError | 0으로 나눔 | 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 블록을 실행 |
- 트레이스백에서 오류의 종류가 적힌 줄은?
- 첫째 줄
- File 줄
- 마지막 줄
- ^ 표시가 있는 줄
int("12a")는 어떤 오류를 낼까요?- TypeError
- ValueError
- NameError
- SyntaxError
pritn("hi")는 어떤 오류를 낼까요?- SyntaxError
- NameError
- TypeError
- 오류 없음
- 프로그램이 첫째 줄을 출력한 뒤 둘째 줄에서 오류로 멈췄습니다. 원인이 될 수 없는 오류는?
- SyntaxError
- NameError
- TypeError
- ZeroDivisionError
- 무엇이 출력될까요?
try: x = 10 / 0 except ZeroDivisionError: x = -1 print(x) - 실행하면 어떻게 될까요?
print("start") print(5 / 0) print("end")- start와 end를 출력한다
- start를 출력한 뒤 ZeroDivisionError로 멈춘다
- 아무것도 출력하기 전에 ZeroDivisionError로 멈춘다
- start, inf, end를 출력한다
- 프로그램이 아무 메시지 없이 실행되는데 합계가 틀리게 나옵니다. 어떤 오류일까요?
- SyntaxError
- 논리 오류
- NameError
- IndentationError
- 무엇이 출력될까요?
spent = {"a": 4500, "b": 10000} print(30000 - sum(spent.values())) - 아래 결과가 나오도록 작은 프로그램의 줄을 순서대로 놓으세요.출력
80.0 - 버그가 어디에 있을까요? 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는 첫 줄 실행 전에 멈추고, 다른 오류는 실행 도중에 멈춤.
- 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