[파이썬 11] 파이썬 에러메시지 읽는 법


코드를 짜다 보면 빨간 글씨로 가득한 오류 메시지, 즉 트레이스백(traceback)을 마주하게 된다. 처음 보면 압도적으로 느껴지지만, 사실 파이썬은 문제가 생겼을 때 아무 정보 없이 그냥 멈추는 게 아니라 무엇이, 왜, 어디서 잘못됐는지를 상당히 구체적으로 알려준다. 이 정보를 읽는 법만 알면 디버깅은 겁먹을 일이 아니라 오히려 실마리를 주는 과정이 된다.


1. 트레이스백은 아래에서부터 위로 읽는다


가장 중요한 원칙이다. 다른 프로그래밍 언어는 예외를 맨 위에 출력하고 위에서 아래로 읽는 방식이 많은데, 파이썬은 반대다. 트레이스백의 맨 마지막 줄에 실제로 무슨 오류가 발생했는지(오류 종류와 메시지)가 나오고, 그 위로 갈수록 어떤 함수 호출을 거쳐 여기까지 왔는지 나오는 구조다. 그래서 오류가 났을 때는 맨 아래 줄부터 먼저 확인하는 게 핵심이다.


Traceback (most recent call last):

File "example.py", line 4, in <module>

main()

File "example.py", line 2, in main

print(x)

NameError: name 'x' is not defined


이 예시에서 맨 아래 NameError: name 'x' is not defined가 실제 오류 내용이다. x라는 이름이 정의되지 않았다는 뜻이고, 그 위 줄들은 이 오류가 어떤 코드 흐름(2번째 줄의 main 함수 안에서)을 거쳐 발생했는지를 보여준다.


2. 자주 만나는 오류 유형들


NameError: 정의되지 않은 변수나 함수 이름을 사용했을 때 발생한다. 오타이거나, 변수를 선언하기 전에 사용했거나, 스코프(범위) 밖에서 접근하려는 경우가 대표적인 원인이다.

TypeError: 호환되지 않는 자료형끼리 연산을 시도했을 때 발생한다. 예를 들어 문자열과 숫자를 그냥 더하려고 하면 파이썬은 결과가 문자열 이어붙이기인지 산술 덧셈인지 알 수 없어서 이 오류를 낸다.

IndexError: 리스트의 존재하지 않는 인덱스에 접근하려 할 때 발생한다.

KeyError: 딕셔너리에 없는 키로 값을 찾으려 할 때 발생한다.

AttributeError: 해당 객체가 갖고 있지 않은 메서드나 속성을 호출하려 할 때 발생한다.

ModuleNotFoundError: import하려는 모듈이 설치되어 있지 않을 때 발생한다.


# TypeError 예시

'2' + 2

# TypeError: can only concatenate str (not "int") to str


이 코드는 문자열 '2'와 정수 2를 더하려고 해서 오류가 난 것이다. 파이썬은 서로 다른 타입을 암묵적으로 변환해서 연산하지 않기 때문에, int('2') + 2처럼 명시적으로 형변환을 해줘야 한다.


3. 오류 메시지가 가리키는 줄이 항상 정확하진 않다


트레이스백이 가리키는 줄에 실제 오류의 원인이 없는 경우도 있다. 파이썬은 인터프리터가 문제를 처음 감지한 지점을 가리키는 것이지, 근본 원인이 있는 지점을 정확히 짚어주는 게 아니기 때문이다. 예를 들어 함수의 매개변수 이름을 잘못 적었는데, 트레이스백이 가리키는 줄에는 문제가 없어 보이는 경우가 있다. 이럴 땐 그 변수가 코드 어디서 정의되고 사용됐는지 전체적으로 훑어보는 접근이 필요하다.


4. 실전 디버깅 팁


오류를 해결할 때 도움이 되는 몇 가지 접근법이 있다. print문을 중간중간 넣어서 변수 값을 직접 확인하는 방법이 가장 기본적이고, 오류 메시지를 검색할 땐 오류 종류와 핵심 문구를 그대로 검색하는 게 효과적이다. 또한 재현 가능한 최소한의 코드(문제를 일으키는 부분만 남긴 짧은 코드)로 줄여서 확인하면 원인을 훨씬 빨리 찾을 수 있다.


5. 정리


에러 메시지는 파이썬이 "여기서 이런 문제가 생겼다"고 알려주는 친절한 안내문에 가깝다. 트레이스백을 아래에서부터 읽고, 오류 종류(NameError, TypeError 등)가 뭘 의미하는지 알아두면, 처음엔 무섭게 보이던 빨간 글씨도 문제 해결의 실마리로 바뀐다.