오류 메시지 읽는 법
오류 메시지, 겁먹지 말자! (그냥 읽는 법부터)
프로그램 만들다 보면… 어? 또 오류가 뜨네? 이거 진짜 다들 한 번쯤 겪는 거고, 나도 엄청 겪었어.
솔직히 말하면 처음엔 오류 메시지 보면 마음이 먼저 도망가더라. “이게 뭐지… 나 망한 거 아냐?” 같은 느낌? 그런데 알고 보면 오류 메시지는 무조건 길을 안내해 주는 안내판이야. 우리가 못 읽을 뿐이지.
오늘은 오류 메시지 읽는 법을 딱 잡아볼게. 그리고 나름대로 “아, 이럴 땐 이렇게 확인하면 됐었지!” 흐름을 만들어두자.
1) 오류 메시지의 기본 구조부터 보기
오류가 뜨면 보통 이런 정보가 같이 따라와.
- 무슨 종류의 오류인지
- 어느 파일에서
- 어느 줄에서
- 무슨 내용 때문에 터졌는지(힌트)
예시로 대충 이런 모양을 상상하면 돼:
Traceback (most recent call last):
File "main.py", line 12, in <module>
print(x / y)
ZeroDivisionError: division by zero
여기서 내가 잡아야 할 건 딱 이거야:
Traceback ...아래에 호출 순서(어디까지 갔는지)가 적혀 있고- 맨 아래 한 줄의
ZeroDivisionError: division by zero가 결론(무슨 오류인지)임
그리고 File "main.py", line 12가 범인 후보 지점이지. 보통은 여기부터 시작하면 꽤 빨리 잡혀.
아! 여기서 하나 팁.
사람 마음으로는 “처음부터 다 읽고 싶다”인데… 사실은 맨 아래(결론) → 그 위(줄 번호) → 그 코드 주변 순서로 보면 속도가 빨라.
2) 제일 중요한 건 “맨 아래”를 먼저 보는 거야
나 예전에 진짜 어이가 없었던 게, 오류 나면 Traceback 위쪽부터 줄줄이 읽다가 한참 헤맨 적 있어.
솔직히 말하면… 나름 잘 읽는 편이라고 생각했는데도 계속 틀렸지 뭐. 😅
그런데 어느 순간부터 이렇게 바꿨어.
- 맨 아래 오류 이름 + 메시지 먼저 보기
- 그 오류가 왜 났는지 감(감만 잡아도 성공!)
- 그다음에 줄 번호 있는 부분 확인
오류 메시지는 “너 여기서부터 문제 생겼어”라고 친절히 말해주는 편이야.
3) 흔한 오류 유형 몇 가지, 감으로 익히기
전부 다 외울 필요는 없어. 대신 자주 만나는 애들만 “아! 또 이거구나” 수준으로 익혀두면 좋아.
3-1. 문법 오류(바로 안 돌아감)
- 오타, 괄호/따옴표 누락
- 들여쓰기 문제(파이썬이면 진짜 자주 만남)
예를 들어:
print("hello)
이건 따옴표가 닫히지 않아서 터지겠지? 이런 류는 보통 오류 메시지에 “SyntaxError”가 떠.
3-2. 이름 오류(변수/함수 이름이 이상함)
x를 써야 하는데X를 썼다거나- 변수 만들기 전에 사용했다거나
보통 이런 느낌:
NameError: name 'x' is not defined
3-3. 타입 오류(서로 다른 종류를 섞었을 때)
- 숫자랑 문자열을 계산하려고 함
- 리스트랑 숫자를 더하려고 함
예를 들면:
"3" + 4
이러면 “문자열이랑 숫자를 어떻게 더해?” 이런 식으로 타입 관련 오류가 나.
3-4. 값 오류(값이 규칙을 깨는 경우)
- 범위를 넘어가는 인덱스
- 조건에 맞지 않는 입력
4) “줄 번호”가 가리키는 곳부터 보면, 보통 끝난다
오류 메시지에 line 12 이런 게 나오면, 그 줄을 보자.
그리고 그 줄만 보면 좀 부족할 때가 있어. 왜냐면:
- 문제는 바로 위 코드에서 이미 만들어졌을 수도 있고
- 변수 값이 전에 바뀌어버렸을 수도 있어
그래서 내가 추천하는 방식은 이거야:
- 오류 난 줄 자체 보기
- 그 줄에서 쓰는 변수/함수가 어디에서 생겼는지 확인
- 그 변수를 만드는 코드부터 한 번 점검
이렇게만 해도, “아… 진짜 대충 아무거나 바꾸는 삽질”이 줄어들더라. (나도 삽질을 꽤 했어. 하하)
5) 그래도 안 잡히면: “최소 확인 3종 세트”
가끔은 오류가 너무 이상하게 보여서 멘붕 오거든. 그럴 땐 억지로 계속 바꾸지 말고, 최소 확인만 해봐. 나름 잘 먹히는 방법들.
- (1) 해당 값이 진짜 있는지
- 변수 초기화 했는지?
- (2) 값이 예상한 타입인지
- 숫자인 줄 알았는데 문자열일 수도 있음
- (3) 값이 예상한 범위인지
- 인덱스가 범위를 넘는 건 아닌지
이때 제일 유용한 게… 로그 찍기!
콘솔에 잠깐 출력해서 “지금 이 값이 뭐야?” 확인하는 거지.
print("x=", x, "type=", type(x))
이거 하나로 “아! 그래서 이게 터졌구나!” 하고 깨닫는 순간이 꽤 많아.
6) “오류 해결”의 태도: 이건 버그가 아니라 힌트다
솔직히 말하면, 오류는 기분을 좀 잡아먹잖아.
근데 난 이제 이렇게 생각해. 오류는 내가 다음에 고쳐야 할 지점을 딱 보여주는 힌트라고.
그리고 재미있는 건…
오류를 잘 읽기 시작하면, 개발이 갑자기 빨라진다는 거야. 내가 이것도 “체감”했어.
다음 글(2-1)에서는 뭐하냐면?
이제 오류 메시지를 읽는 기본기를 잡았으니까, 다음엔 변수와 데이터 다루기로 넘어가자.
사실 대부분의 오류는 “변수에 뭘 담았는지”에서 시작하거든.
예를 들면 이런 것들:
- 변수 이름을 다르게 썼다
- 문자열인 줄 알았는데 숫자가 아니었다
- 값을 바꾸는 흐름을 놓쳤다
음… 그러니까 다음 글에서 변수/데이터를 정확히 잡는 법을 같이 보면, 오류가 훨씬 덜 무섭게 느껴질 거야.
자, 그럼 다음 편에서 보자! 🚀





