본문으로 건너뛰기

오류 메시지 읽기

자바스크립트 목차첫 프로그램레슨 3 / 76

목차

오류 메시지(error message)는 자바스크립트가 코드를 실행하다 막힌 곳과 그 까닭을 알려 주는 글입니다. …Error:로 시작하는 줄을 먼저 찾아 읽으면 무슨 일이 어디서 났는지 빨리 찾을 수 있습니다.

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

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

1실행 중 오류 — 앞 문장까지 실행하고 멈춘다

그림의 첫 코드는 2번 줄에서 console을 consol로 잘못 썼습니다.

console.log(1);
consol.log(2);
console.log(3);
실행 결과
1main.js:2consol.log(2);^ ReferenceError: consol is not defined    at main.js:2:1

1번 줄은 실행되어 1이 찍혔고, 2번 줄에서 consol이라는 이름을 찾지 못해 오류가 나 멈췄습니다. 3번 줄은 실행되지 않습니다. 이렇게 문장을 실행하다 나는 오류를 실행 중 오류라고 합니다. 오류가 난 문장에서 실행이 멈추고, 그 전에 찍힌 출력은 남습니다(규칙 1). 자료에 따라 예외(exception)라고도 부릅니다.

2메시지는 …Error 줄부터 읽는다

Node의 오류 메시지는 무슨 일인지 알려 주는 줄이 맨 위가 아니라 가운데에 있습니다. 맨 위 줄부터 읽으면 자리만 보고 무슨 일인지는 놓치기 쉽습니다.

메시지의 줄뜻
main.js:2main.js 파일의 2번 줄에서
consol.log(2);그 줄의 코드를 다시 찍은 것
^그 줄에서 문제를 발견한 자리
ReferenceError: …무슨 일인가 — 먼저 읽을 줄
at main.js:2:12번 줄 1번째 칸을 실행하다 멈췄다

읽는 차례는 셋입니다.

  1. …Error: 줄 — 무슨 일인가. 결과 상자에서 빨간 글자로 보이는 줄입니다. 콜론(:) 앞 ReferenceError가 오류 이름, 뒤가 설명입니다. consol is not defined⁠는 'consol이 정의되어 있지 않다', 곧 그런 이름이 없다는 뜻입니다.
  2. main.js:2와 ^ — 어디서인가. 2번 줄의 ^ 자리에서 문제를 발견했습니다. ^^^^처럼 여럿이면 그 글자들을 함께 짚습니다.
  3. 그 줄과 앞줄 — 왜인가. 2번 줄을 보면 consol이 오타입니다. 그 줄만으로 까닭이 안 보이면 그 줄의 이름이나 값을 만든 앞줄을 봅니다.

맨 아래 at main.js:2:1은 실행 중 오류에만 찍히는 줄입니다(3절). main.js는 이 과목이 예제를 저장한 파일 이름이고, 내 컴퓨터의 터미널에서는 줄이 몇 개 더 보입니다(끝의 '컴퓨터에서 해 보기'). 고칠 때는 메시지를 읽고, 까닭을 하나 짐작하고, 한 곳만 고쳐 다시 실행합니다. 2번 줄을 console.log(2);로 고치면 1, 2, 3이 차례로 찍힙니다.

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

그림의 둘째 코드는 2번 줄의 괄호를 닫지 않았습니다.

console.log(1);
console.log(2;
console.log(3);
실행 결과
main.js:2console.log(2;            ^ SyntaxError: missing ) after argument list

이번에는 1도 찍히지 않았습니다. 자바스크립트는 실행하기 전에 파일 전체가 쓰는 법, 곧 문법(syntax)에 맞는지 먼저 봅니다. 어긋난 곳이 하나라도 있으면 한 문장도 실행하지 않고 문법 오류(SyntaxError)를 냅니다. 설명 missing ) after argument list⁠는 '괄호 안에 넘긴 값 뒤에 )가 빠졌다'는 뜻입니다. ^가 짚은 2 바로 뒤에 )를 붙여 고칩니다.

문법 오류는 실행하기 전에 나서 at main.js:2:1 같은 줄이 없습니다. 두 오류는 아래 두 표시로 가릅니다.

문법 오류실행 중 오류
언제 찾나실행하기 전, 파일 전체를 볼 때그 문장을 실행할 때
앞 문장의 출력없다 — 한 문장도 실행되지 않는다남는다 — 앞 문장까지 실행된다
main.js가 든 at 줄없다있다(at main.js:2:1)

4처음 만날 오류 이름 셋

1~5단원에서 자주 만날 오류 이름은 셋입니다.

오류 이름뜻이 레슨의 예
SyntaxError괄호·따옴표처럼 쓰는 법에 어긋났다3절
ReferenceError그런 이름이 없다 — 점 앞 이름의 오타(consol), 대문자, 만들기 전에 씀1절
TypeError그 값으로는 그 일을 할 수 없다 — 부를 수 없는 것을 부름예제 둘째

예제

무엇이 찍히고 어디서 멈출지 먼저 적어 본 뒤 결과를 펼쳐 보세요.

console.log('커피', 4000);
console.log('라테', 4500);
console.log(8500;

마지막 줄의 괄호를 닫지 않았습니다. 무엇이 찍힐까요?

실행 결과 보기
실행 결과
main.js:3console.log(8500;            ^^^^ SyntaxError: missing ) after argument list

예상과 다르면 그곳이 배울 곳입니다. 커피 4000과 라테 4500이 먼저 찍힌다고 예상했다면 문법 오류를 실행 중 오류처럼 본 것입니다. 문법 오류는 실행 전에 걸려 한 문장도 실행하지 않습니다(3절).

다음 코드는 2번 줄에서 log를 lg로 잘못 썼습니다.

console.log('커피');
console.lg('라테');
console.log('쿠키');

무엇이 찍히고 몇 번 줄에서 멈출까요?

실행 결과 보기
실행 결과
커피main.js:2console.lg('라테');        ^ TypeError: console.lg is not a function    at main.js:2:9

예상과 다르면 그곳이 배울 곳입니다. lg는 쓰는 법에는 맞아 문법 오류가 아니므로, 커피가 찍힌 뒤 2번 줄에서 멈춥니다. console은 있는 이름이지만 lg라는 기능이 없어 부를 수 없는 것을 부른 셈이라 TypeError입니다(is not a function — 함수가 아니다). 같은 오타라도 점 앞 이름(consol)이 틀리면 ReferenceError, 점 뒤(lg)가 틀리면 이처럼 TypeError입니다.

자주 틀리는 곳

틀린 생각: 문법 오류가 마지막 줄에 있으면 그 앞 문장은 실행된다.

실행 중 오류는 오류가 난 문장 앞까지 실행되니(1절), 문법 오류도 그러리라 여기게 됩니다. 문법 오류가 있으면 앞 문장도 실행되지 않습니다.

console.log(1);
console.log(2);
console.log('end);
실행 결과
main.js:3console.log('end);            ^^^^^^ SyntaxError: Invalid or unexpected token

3번 줄의 문자열이 닫는 따옴표 없이 끝나 문법에 어긋났고, 잘못이 없는 1·2번 줄도 실행되지 않았습니다. 따옴표를 하나만 빠뜨리면 이렇게 문법 오류가, 둘 다 빼면 글자를 이름으로 읽어 실행 중 오류(ReferenceError)가 납니다.

맞는 규칙: 자바스크립트는 실행하기 전에 파일 전체가 문법에 맞는지 먼저 봅니다. 한 곳이라도 어긋나면 한 문장도 실행하지 않습니다.

틀린 생각: ^가 가리키는 자리가 곧 고칠 자리다.

^가 코드 바로 밑에서 한 곳을 짚으니 그곳만 고치면 될 것처럼 보입니다. ^는 문제를 발견한 자리일 뿐입니다.

console.log('주문')
(1 + 2);
실행 결과
주문main.js:2(1 + 2);^ TypeError: console.log(...) is not a function    at main.js:2:1

^는 2번 줄을 가리키지만 고칠 곳은 1번 줄 끝입니다. ;이 없어 두 줄이 한 문장으로 이어졌고, 이어진 자리에서야 문제가 드러났습니다(프로그램은 위에서 아래로의 ; 이야기).

맞는 규칙: 고칠 곳은 ^의 둘레, 곧 그 줄과 앞줄에서 찾습니다. ^ 자리만 보면 잘못 쓴 곳을 놓칠 수 있습니다.

확인 문제

1. 1절 코드에서 오타가 2번 줄이 아니라 3번 줄에 있습니다. 무엇이 찍히고 몇 번 줄에서 멈추는지 실행 결과를 그대로 쓰세요. 오류 메시지는 …Error: 줄만 써도 됩니다.

console.log(1);
console.log(2);
consol.log(3);
힌트

1절 코드의 실행 결과에서 오류가 난 문장의 앞 문장과 뒤 문장이 어떻게 되었는지 봅니다.

정답
실행 결과
12main.js:3consol.log(3);^ ReferenceError: consol is not defined    at main.js:3:1

1번 줄과 2번 줄은 실행되어 1과 2가 찍히고, 3번 줄에서 멈춥니다. 흔한 오답은 아무것도 찍히지 않는다고 쓴 답입니다. 실행 중 오류를 문법 오류처럼 본 것입니다.

2. 오류 메시지를 읽고 고치는 차례대로 ㉠~㉣을 놓으세요.

  • ㉠ main.js:2와 ^로 어디서 발견했는지 본다
  • ㉡ …Error:로 시작하는 줄에서 오류 이름과 설명을 읽는다
  • ㉢ 한 곳만 고쳐 다시 실행한다
  • ㉣ 그 줄과 앞줄을 보고 까닭을 짐작한다

다 놓은 뒤에는 아래 '놓은 뒤 물음'을 펼쳐 하나 더 고르세요.

힌트

㉠~㉣이 저마다 무엇을 알아내는 일인지 적고, 고치려면 무엇부터 알아야 하는지 따져 봅니다.

놓은 뒤 물음

㉡이 맨 앞에 오는 까닭은 무엇일까요?

  • ① 무슨 일이 났는지가 그 줄에 있기 때문
  • ② 그 줄이 메시지의 맨 위에 찍히기 때문
  • ③ 그 줄이 가장 짧아 읽기 좋기 때문
정답

㉡ ㉠ ㉣ ㉢ 차례이고, 까닭은 ①입니다.

  • ② 그 줄은 가운데에 찍힙니다. 맨 위는 main.js:2 같은 자리 줄입니다.
  • ③ 줄의 길이가 아니라 담긴 내용(오류 이름과 설명) 때문에 먼저 읽습니다.

3. 과목별 점수를 찍다가 마지막 줄에 닫는 괄호를 하나 더 썼습니다. 실행 결과를 그대로 쓰세요. 오류 메시지는 …Error: 줄만 써도 됩니다.

console.log('국어');
console.log(90);
console.log('수학');
console.log(85));
힌트

괄호가 맞지 않는 것은 쓰는 법의 문제입니다. 3절의 표에서 이런 오류의 앞 문장이 어떻게 되는지 봅니다.

정답
실행 결과
main.js:4console.log(85));               ^ SyntaxError: Unexpected token ')'

짝이 없는 닫는 괄호는 문법 오류라 한 문장도 실행하지 않습니다. Unexpected token ')'는 '여기서 )는 뜻밖이다'라는 뜻입니다. 이 설명은 처음 보는 글이니, 아무것도 찍히지 않고 SyntaxError로 멈춘다고 썼으면 맞습니다. 흔한 오답은 국어 · 90 · 수학을 먼저 쓴 답입니다. 오류가 마지막 줄에 있으니 앞 문장은 실행된다고 본 것입니다.

컴퓨터에서 해 보기(선택) — 점수에 들지 않습니다. 폰으로만 보고 있다면 건너뛰세요. 3절 코드(세 줄)를 저장해 돌린 뒤, 2번 줄을 console.log(2);로 고치면 무엇이 찍힐지 먼저 적고 고쳐 돌려 맞춰 봅니다. 고치기 전의 문법 오류는 터미널에 결과 상자보다 줄이 더 찍힙니다.

결과 상자내 컴퓨터의 터미널
main.js:2앞에 폴더 경로가 붙음 — file:///…/main.js:2
(없음)node:가 든 at 줄 여럿(Node 24 · 26은 열 개, 판에 따라 다름) — Node 안쪽의 길이라 읽지 않아도 됨
(없음)Node.js v26.12.0 같은 판 줄 — 쓰고 있는 Node 판(숫자는 받은 판에 따라 다름)

나머지 줄은 같습니다. 터미널에도 main.js가 든 at 줄은 없고 앞 문장의 출력도 없으니, 문법 오류로 가를 수 있습니다. Node를 설치하고 저장해 돌리는 법은 내 컴퓨터에서 돌려 보기에 있습니다.

더 보기: 변수: let으로 이름 붙이기

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

자바스크립트 목차로