본문으로 건너뛰기

오류 메시지 읽기

파이썬 목차첫 프로그램레슨 3 / 59

목차

오류 메시지(error message)는 파이썬이 코드를 실행하다 막힌 곳과 그 까닭을 알려 주는 글입니다. 맨 아래 줄부터 읽으면 무슨 일이 어디서 났는지 빨리 찾을 수 있습니다.

코드를 쓰다 보면 오류는 누구나 자주 만납니다. 화면에 찍히는 영어 메시지는 컴퓨터가 어디가 이상한지 짚어 주는 정보입니다. 이 레슨에서는 메시지를 읽는 차례와, 오류가 언제 나느냐에 따라 앞줄이 실행되는지가 갈린다는 것을 봅니다.

10단계 중 1단계. 셋째 줄에 오타가 있는 코드입니다. 다음을 누르면 1번 줄부터 실행합니다.

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: …(맨 아래 줄)무슨 일인가 — 먼저 읽을 줄

읽는 차례는 셋입니다.

  1. 맨 아래 줄 — 무슨 일인가. 실행 결과 상자에서 빨간 글자로 보이는 맨 아래 줄이 무슨 일이 났는지 알려 주는 줄입니다. 콜론(:) 앞의 NameError가 오류 이름, 뒤가 설명입니다. name 'pritn' is not defined⁠는 'pritn이라는 이름이 정의되어 있지 않다', 곧 그런 이름이 없다는 뜻입니다.
  2. 줄 번호와 ^ — 어디서인가. line 3은 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
4

3문법 오류 — 한 줄도 실행하지 않는다

그림의 둘째 코드는 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 2Traceback (most recent call last):
오류 이름의 예SyntaxError·IndentationErrorNameError·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를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로