오류 메시지(error message)는 파이썬이 코드를 실행하다 막힌 곳과 그 까닭을 알려 주는 글입니다. 맨 아래 줄부터 읽으면 무슨 일이 어디서 났는지 빨리 찾을 수 있습니다.
코드를 쓰다 보면 오류는 누구나 자주 만납니다. 화면에 찍히는 영어 메시지는 컴퓨터가 어디가 이상한지 짚어 주는 정보입니다. 이 레슨에서는 메시지를 읽는 차례와, 오류가 언제 나느냐에 따라 앞줄이 실행되는지가 갈린다는 것을 봅니다.
1실행 중 오류 — 앞줄까지 실행하고 멈춘다
그림의 첫 코드는 3번 줄에서 print를 pritn으로 잘못 썼습니다.
print(1)
print(2)
pritn(3)
print(4)
12Traceback (most recent call last): File "main.py", line 3, in <module> pritn(3) ^^^^^NameError: name 'pritn' is not defined. Did you mean: 'print'?1번 줄과 2번 줄은 실행되어 1과 2가 찍혔습니다. 3번 줄에서 pritn이라는 이름을 찾지 못해 오류가 났고, 실행은 그 자리에서 멈췄습니다. 4번 줄은 실행되지 않아 4는 찍히지 않습니다.
이렇게 줄을 실행하다가 나는 오류를 실행 중 오류라고 합니다. 오류가 난 줄에서 실행이 멈추고, 그 전에 찍힌 출력은 그대로 남습니다(규칙 1).
파이썬 문서는 실행 중 오류를 예외(exception)라고 부릅니다. 예외를 다루는 법은 9단원에서 배웁니다.
2메시지는 맨 아래 줄부터 읽는다
메시지를 위에서부터 읽으면 Traceback으로 시작하는 첫 줄에서 막히기 쉽습니다. 이 줄은 '오류가 났고, 그 자리까지 온 길을 아래에 적는다'는 머리일 뿐입니다. 무슨 일인지는 맨 아래 줄에 있습니다.
| 메시지의 줄 | 뜻 |
|---|---|
Traceback (most recent call last): | 오류가 났다는 머리 |
File "main.py", line 3, in <module> | main.py 파일의 3번 줄에서 |
pritn(3) | 그 줄의 코드를 다시 찍은 것 |
^^^^^ | 그 줄에서 문제를 발견한 자리 |
NameError: …(맨 아래 줄) | 무슨 일인가 — 먼저 읽을 줄 |
읽는 차례는 셋입니다.
- 맨 아래 줄 — 무슨 일인가. 실행 결과 상자에서 빨간 글자로 보이는 맨 아래 줄이 무슨 일이 났는지 알려 주는 줄입니다. 콜론(:) 앞의
NameError가 오류 이름, 뒤가 설명입니다.name 'pritn' is not defined는 'pritn이라는 이름이 정의되어 있지 않다', 곧 그런 이름이 없다는 뜻입니다. - 줄 번호와
^— 어디서인가.line 3은 3번 줄입니다. 다시 찍힌 코드 밑의^^^^^는 그 줄에서 파이썬이 문제를 발견한 자리입니다. 줄의 꼴에 따라^줄이 찍히지 않을 때도 있는데(입력은 늘 글자에 그런 예가 있습니다), 그때는 줄 번호로 그 줄을 찾습니다. - 그 줄과 앞줄 — 왜인가. 3번 줄을 보면
print를pritn으로 잘못 썼습니다. 그 줄만 봐서 까닭이 보이지 않으면, 그 줄에 쓰인 이름이나 값을 만든 앞줄을 봅니다. 이런 오류는 다음 레슨 변수: 값에 이름 붙이기에서 봅니다.
Did you mean: 'print'?는 비슷한 이름을 찾아 건네는 파이썬의 짐작이라, 맞을 때가 많지만 늘 맞지는 않습니다.
파일 이름이 main.py인 것은 이 과목이 예제를 main.py로 저장해 돌렸기 때문입니다. <module>은 파일의 맨 바깥 줄이라는 뜻입니다(함수 안이면 함수 이름이 나옵니다).
내 컴퓨터에서는 파일 이름 앞에 폴더가 붙거나 문구가 조금 다를 수 있지만, 판이 달라도 맨 아래 줄의 오류 이름은 같습니다. 어디가 다른지는 내 컴퓨터에서 돌려 보기에서 봅니다.
고칠 때는 메시지를 읽고, 까닭을 하나 짐작하고, 한 곳만 고쳐 다시 실행합니다. 3번 줄의 pritn을 print로 고치면 끝까지 실행됩니다.
print(1)
print(2)
print(3)
print(4)
1
2
3
43문법 오류 — 한 줄도 실행하지 않는다
그림의 둘째 코드는 2번 줄의 괄호를 닫지 않았습니다.
print(1)
print(2
print(3)
File "main.py", line 2 print(2 ^SyntaxError: '(' was never closed이번에는 1도 찍히지 않았습니다. 파이썬은 실행하기 전에 파일 전체가 파이썬의 쓰는 법, 곧 문법(syntax)에 맞는지 먼저 봅니다. 어긋난 곳이 하나라도 있으면 한 줄도 실행하지 않고 문법 오류(SyntaxError)를 냅니다.
맨 아래 줄 '(' was never closed는 '연 괄호를 닫지 않았다'는 뜻입니다. ^는 2번 줄에서 괄호를 연 자리를 가리키지만, 고칠 곳은 그 줄의 끝입니다. 끝에 닫는 괄호를 붙입니다.
두 오류를 견주면 다음과 같습니다.
| 문법 오류 | 실행 중 오류 | |
|---|---|---|
| 언제 찾나 | 실행하기 전, 파일 전체를 볼 때 | 그 줄을 실행할 때 |
| 앞줄 | 한 줄도 실행되지 않는다 | 앞줄까지 실행된다 |
| 메시지 첫 줄 | File "main.py", line 2 | Traceback (most recent call last): |
| 오류 이름의 예 | SyntaxError·IndentationError | NameError·TypeError·IndexError |
4처음 만날 오류 이름 다섯
오류 이름은 대부분 Error로 끝나고, 앞부분이 무슨 오류인지 말해 줍니다. 1~6단원에서 자주 만날 다섯은 이렇습니다.
| 오류 이름 | 뜻 | 처음 만나는 곳 |
|---|---|---|
SyntaxError | 괄호·따옴표·콜론처럼 쓰는 법에 어긋났다 | 이 레슨 |
IndentationError | 줄 앞의 빈칸(들여쓰기)이 맞지 않는다. 문법 오류의 한 갈래다 | 조건·반복 단원 |
NameError | 그런 이름이 없다 — 오타, 대문자, 만들기 전에 씀 | 이 레슨 · 변수: 값에 이름 붙이기 |
TypeError | 값의 종류가 맞지 않는다 — 글자와 수를 더함 | 수와 글자 |
IndexError | 없는 자리를 꺼냈다 | 인덱스와 자르기 |
예제
무엇이 찍히고 어디서 멈출지 먼저 적어 본 뒤 결과를 펼쳐 보세요.
print('커피', 4000)
print('라테', 4500)
print(8500
마지막 줄의 괄호를 닫지 않았습니다. 무엇이 찍힐까요?
실행 결과 보기
File "main.py", line 3 print(8500 ^SyntaxError: '(' was never closed예상과 다르면 그곳이 배울 곳입니다. 커피 4000과 라테 4500이 먼저 찍힌다고 예상했다면, 문법 오류를 실행 중 오류처럼 본 것입니다. 문법 오류는 실행하기 전에 찾아내므로 한 줄도 실행하지 않습니다(3절).
다음 코드는 2번 줄에서 따옴표를 빠뜨렸습니다.
print('커피')
print(coffee)
print('라테')
무엇이 찍히고 몇 번 줄에서 멈출까요?
실행 결과 보기
커피Traceback (most recent call last): File "main.py", line 2, in <module> print(coffee) ^^^^^^NameError: name 'coffee' is not defined예상과 다르면 그곳이 배울 곳입니다. 따옴표가 열린 채 끝나면(print('coffee)) 문자열이 끝나지 않아 문법 오류(SyntaxError)가 나지만, 따옴표가 아예 없으면 파이썬은 coffee를 글자가 아니라 이름으로 읽어 실행 중 오류 NameError가 납니다. 그런 이름이 없어 2번 줄에서 멈추고, 3번 줄은 실행되지 않습니다. 1번 줄은 이미 실행되어 커피가 찍혀 있습니다. 고칠 곳은 2번 줄이고, print('coffee')처럼 따옴표로 감쌉니다.
자주 틀리는 곳
틀린 생각: 오류 메시지에서 가장 중요한 말은 첫 줄에 있다.
글은 보통 첫머리에 중요한 말을 두니, 메시지도 첫 줄부터 붙들게 됩니다. 무슨 일인지는 맨 아래 줄에 있습니다.
print(1 2)
File "main.py", line 1 print(1 2) ^^^SyntaxError: invalid syntax. Perhaps you forgot a comma?맨 아래 줄은 오류 이름 SyntaxError와 함께 '쉼표를 빠뜨린 것 같다'는 짐작까지 건넵니다. print(1, 2)로 고치면 1 2가 찍힙니다.
맞는 규칙: 맨 아래 줄부터 읽고, 그다음 줄 번호와 ^, 그 줄과 앞줄 차례로 봅니다.
틀린 생각: 문법 오류가 마지막 줄에 있으면 그 앞줄은 실행된다.
실행 중 오류는 오류가 난 줄 앞까지 실행되니(1절), 문법 오류도 그러리라 여기게 됩니다. 문법 오류가 있으면 앞줄도 실행되지 않습니다.
print(1)
print(2)
print(3)
print(4))
File "main.py", line 4 print(4)) ^SyntaxError: unmatched ')'unmatched ')'는 짝이 없는 닫는 괄호가 있다는 뜻입니다. 1~3번 줄에는 잘못이 없는데도 1도 찍히지 않았습니다.
맞는 규칙: 파이썬은 실행하기 전에 파일 전체가 문법에 맞는지 먼저 봅니다. 한 곳이라도 어긋나면 한 줄도 실행하지 않습니다.
틀린 생각: ^가 가리키는 자리가 곧 고칠 자리다.
^는 코드 바로 밑에서 한 곳을 짚어, 그곳만 고치면 될 것처럼 보입니다. ^는 파이썬이 문제를 발견한 자리일 뿐입니다.
print('주문')
print('hello)
File "main.py", line 2 print('hello) ^SyntaxError: unterminated string literal (detected at line 2)^는 따옴표를 연 자리를 가리키지만, 빠진 것은 끝의 닫는 따옴표입니다. unterminated string literal은 '끝나지 않은 문자열'이라는 뜻입니다. 문법 오류라서 1번 줄의 주문도 찍히지 않았습니다.
맞는 규칙: 고칠 곳은 ^의 둘레, 곧 그 줄과 앞줄에서 찾습니다.
틀린 생각: 오류가 나면 실패한 것이다.
영어 메시지가 화면에 길게 뜨면 일이 크게 잘못된 것처럼 보입니다. 2절의 코드는 한 글자만 고쳐 끝까지 돌았습니다. 고친 뒤 다음 오류가 나오면 앞의 오류를 지나 한 걸음 나아간 것입니다.
맞는 규칙: 오류 메시지는 파이썬이 막힌 곳과 그 까닭을 알려 줍니다. 메시지를 읽고 한 곳만 고쳐 다시 실행합니다.
확인 문제
1. 1절 코드에서 오타가 3번 줄이 아니라 2번 줄에 있습니다. 무엇이 찍히고 몇 번 줄에서 멈추는지 실행 결과를 그대로 쓰세요. 오류 메시지는 맨 아래 줄만 써도 됩니다.
print(1)
pritn(2)
print(3)
print(4)
힌트
1절 코드의 실행 결과에서 오류가 난 줄의 앞줄과 뒷줄이 어떻게 되었는지 봅니다.
정답
1Traceback (most recent call last): File "main.py", line 2, in <module> pritn(2) ^^^^^NameError: name 'pritn' is not defined. Did you mean: 'print'?1번 줄은 실행되어 1이 찍히고, 2번 줄에서 멈춥니다. 3번 줄과 4번 줄은 실행되지 않습니다. 흔한 오답은 1, 3, 4를 쓴 답입니다. 오류가 난 줄만 건너뛰고 실행이 이어진다고 본 것입니다.
2. 오류 메시지를 읽고 고치는 차례대로 ㉠~㉣을 놓으세요.
- ㉠ 줄 번호와
^로 어디서 발견했는지 본다 - ㉡ 맨 아래 줄에서 오류 이름과 설명을 읽는다
- ㉢ 한 곳만 고쳐 다시 실행한다
- ㉣ 그 줄과 앞줄을 보고 까닭을 짐작한다
놓은 뒤에는 이것도 고르세요. ㉡이 맨 앞에 오는 까닭은 무엇일까요?
- ① 무슨 일이 났는지가 맨 아래 줄에 있기 때문
- ② 맨 아래 줄이 가장 짧아 읽기 좋기 때문
- ③ 맨 아래 줄이 가장 먼저 화면에 찍히기 때문
힌트
㉠~㉣이 저마다 무엇을 알아내는 일인지 적고, 고치려면 무엇부터 알아야 하는지 따져 봅니다.
정답
㉡ ㉠ ㉣ ㉢ 차례이고, 까닭은 ①입니다.
- ② 맨 아래 줄은 짧지 않을 때도 많습니다. 줄의 길이가 아니라 담긴 내용(오류 이름과 설명) 때문에 먼저 읽습니다.
- ③ 맨 아래 줄은 가장 나중에 찍힙니다. 위에서 아래로 찍히지만, 읽기는 맨 아래 줄부터 합니다.
3. 과목별 점수를 찍다가 셋째 줄에서 print를 잘못 썼습니다. 실행 결과를 그대로 쓰세요. 오류 메시지는 맨 아래 줄만 써도 됩니다.
print('국어', 90)
print('수학', 85)
prnt(70)
print('평균', 81)
힌트
1절의 pritn(3)과 같은 잘못입니다. 그 코드에서 앞 두 줄이 어떻게 되었는지 봅니다.
정답
국어 90수학 85Traceback (most recent call last): File "main.py", line 3, in <module> prnt(70) ^^^^NameError: name 'prnt' is not defined. Did you mean: 'print'?prnt는 쓰는 법에는 맞는 이름이라 문법 오류가 아닙니다. 그런 이름이 없다는 것은 3번 줄을 실행할 때 알게 되므로, 앞 두 줄은 찍히고 3번 줄에서 멈춥니다.
흔한 오답은 아무것도 찍히지 않는다고 쓴 답입니다. 실행 중 오류를 문법 오류처럼 본 것입니다. 거꾸로 평균 81까지 찍힌다고 쓰면, 오류 줄만 건너뛴다고 본 것입니다.
아래 2절 끝 코드의 3번 줄 print(3)을 괄호 없이 print 3으로 바꾸면 찍히는 줄과 메시지를 모두 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.