JS LAB
JS 7.1 · 7부. 실무 준비

에러 읽는 법

자주 만나는 오류 메시지를 읽고 원인을 찾습니다.

예상 학습 시간 17분 실행 단추가 있는 예제는 고쳐서 실행해 볼 수 있습니다 난이도 중급
개념 설명

오류 메시지는 알려 주려고 나옵니다

오류가 나면 놀라기 쉽지만, 그 메시지에는 무엇이·어디서 잘못됐는지가 거의 다 들어 있습니다. 읽는 법만 알면 고치는 시간이 크게 줄어듭니다.

메시지는 세 부분입니다.

  • 종류TypeError 처럼 무엇이 잘못됐는지의 갈래
  • 설명 — 어떤 값에 무엇을 하려다 실패했는지
  • 자리 — 몇 번째 줄인지 (개발자 도구에서 봅니다 · 7.2)
최소 예제 · 편집 가능

가장 자주 만나는 셋

script.js
console.log("여기까지는 나옵니다");

console.log(없는이름);
출력
여기까지는 나옵니다 ReferenceError: 없는이름 is not defined

ReferenceError 는 "그런 이름이 없다" 입니다. 철자를 틀렸거나, 선언하지 않았거나, 다른 스코프에 있는 것입니다(2.4).

오류가 나기 전까지의 출력은 남습니다. 어디까지 갔는지가 곧 어디서 멈췄는지입니다.

script.js
const user = null;

console.log(user.name);
출력 · 크롬
TypeError: Cannot read properties of null (reading 'name')
출력 · 파이어폭스
TypeError: can't access property "name", user is null

TypeError 는 "그 값으로는 그 일을 할 수 없다" 입니다. 위 메시지는 이름이 아니라 값이 문제라고 말합니다 — user 는 있는데 그것이 null 인 것입니다.

script.js
const a = ;
출력 · 크롬
SyntaxError: Unexpected token ';'
출력 · 파이어폭스
SyntaxError: expected expression, got ';'

SyntaxError 는 "읽을 수가 없다" 입니다. 앞의 둘과 크게 다른 점이 있습니다 — 한 줄도 실행되지 않습니다. 출력이 하나도 없다면 이것부터 의심하세요.

상세 사용법

자주 나오는 TypeError

script.js
const value = 5;

value();
출력
TypeError: value is not a function
script.js
const count = 10;

count = 20;
출력 · 크롬
TypeError: Assignment to constant variable.
출력 · 파이어폭스
TypeError: invalid assignment to const 'count'

같은 TypeError 여도 설명이 다릅니다. 종류보다 설명을 먼저 읽으세요.

상세 사용법

끝없이 부르면

script.js
function countdown(n) {
	return countdown(n - 1);
}

countdown(3);
출력 · 크롬
RangeError: Maximum call stack size exceeded
출력 · 파이어폭스
InternalError: too much recursion

함수가 자기를 부르는데 멈추는 조건이 없습니다. if (n <= 0) return; 처럼 끝낼 자리를 두어야 합니다. 1.10 의 무한 루프와 같은 실수입니다.

상세 사용법

메시지를 읽는 차례

  1. 출력이 하나도 없나?SyntaxError 입니다. 괄호·따옴표·쉼표를 봅니다.
  2. 어디까지 출력됐나? — 그다음 줄이 문제입니다.
  3. 설명에 나온 이름을 찾습니다. — 그 값이 무엇인지 console.log 로 찍어 봅니다.
  4. 그 값이 왜 그렇게 됐는지 거슬러 올라갑니다.

메시지를 그대로 검색하는 것도 좋은 방법입니다. 다만 내 코드의 이름은 빼고 검색하세요 — Cannot read properties of null 까지만 적습니다.

상세 사용법

브라우저마다 문구가 다릅니다

같은 잘못인데 브라우저가 다르게 적습니다. 위 예제들의 출력에 두 가지를 함께 적어 둔 것이 그 때문입니다. 크롬과 Edge 는 같은 엔진이라 문구가 같고, 파이어폭스는 다릅니다.

무엇이 잘못됐나크롬 · Edge파이어폭스
없는 이름을 사용 x is not defined x is not defined
없는 값에서 속성을 읽음 Cannot read properties of null (reading 'name') can't access property "name", user is null
const 에 다시 넣음 Assignment to constant variable. invalid assignment to const 'count'
선언 전에 사용 Cannot access 'x' before initialization can't access lexical declaration 'x' before initialization
문법이 어긋남 Unexpected token ';' expected expression, got ';'
끝없이 자기를 호출 RangeError: Maximum call stack size exceeded InternalError: too much recursion

마지막 줄을 보세요. 오류의 이름부터 다릅니다RangeErrorInternalError 입니다. InternalError 는 표준에 없고 파이어폭스만 내는 것입니다.

그래서 검색할 때 브라우저 이름을 함께 적으면 답을 빨리 찾습니다. 반대로 남이 적어 둔 해결 방법이 내 화면의 문구와 달라도, 오류의 종류가 같으면 같은 문제일 때가 많습니다.

흔한 실수

처음에 자주 걸리는 것

1. 메시지를 읽지 않고 코드를 고칩니다

짐작으로 여기저기 바꾸면 원인이 그대로인 채 증상만 옮겨 다닙니다. 먼저 읽으세요.

2. 마지막 줄만 봅니다

비동기 코드에서는 오류가 난 자리와 원인이 멀리 떨어져 있습니다. 어디까지 출력됐는지를 함께 보세요.

3. 오류를 숨깁니다

try...catch 로 감싸고 아무것도 하지 않으면 오류가 사라진 것처럼 보입니다. 원인은 그대로이고 더 찾기 어려워집니다(5.4).

try { 위험한코드(); } catch (e) { }   // 이렇게 하지 않습니다
실습 문제

직접 해보기

1. 어떤 오류일까요 난이도 하

아래 셋이 각각 어떤 오류를 낼지 먼저 적어 보고, 편집기에 넣어 확인하세요.

const list = [1, 2]; list.push(3); list = []; const text = "안녕"; text.toUpperCase; text.upper(); console.log(items.length);
1. TypeError: Assignment to constant variable. 2. TypeError: text.upper is not a function 3. ReferenceError: items is not defined
2. 원인 찾아 고치기 난이도 중

아래 코드는 오류가 납니다. 메시지를 읽고 왜 그렇게 됐는지 거슬러 올라가 고치세요.

const products = [ { name: "연필", price: 1000 }, { name: "공책", price: 2000 } ]; const found = products.find(p => p.name === "가위"); console.log(found.price);
find 는 못 찾으면 undefined 를 돌려줍니다(3.4).
const products = [ { name: "연필", price: 1000 }, { name: "공책", price: 2000 } ]; const found = products.find(p => p.name === "가위"); // 없을 수도 있으니 먼저 확인합니다 console.log(found?.price ?? "그런 상품이 없습니다");
요약

이 단원의 정리

  • ReferenceError 는 그런 이름이 없다는 뜻입니다.
  • TypeError 는 그 값으로는 그 일을 할 수 없다는 뜻입니다.
  • SyntaxError 는 한 줄도 실행되지 않습니다. 출력이 없으면 이것입니다.
  • 어디까지 출력됐는지가 곧 어디서 멈췄는지입니다.
  • 문구는 브라우저마다 다릅니다. 오류의 종류가 같으면 같은 문제입니다.
  • 오류를 catch 로 감싸고 아무것도 하지 않는 것은 숨기는 것입니다.