에러가 났을 때 스택 트레이스를 읽고 원인을 찾는 방법
코딩을 시작하면 누구나 빨간 글씨로 가득한 에러 화면을 만나게 됩니다. 처음에는 무슨 말인지 몰라서 당황하기 쉽지만, 에러 메시지는 사실 문제가 어디서 생겼는지 알려 주는 친절한 안내문입니다. 이 글에서는 파이썬을 예로 들어, 에러 화면에 나오는 스택 트레이스를 읽는 순서와 원인을 찾는 방법을 차근차근 알아봅니다.
스택 트레이스란 무엇인가요?
스택 트레이스는 프로그램이 멈춘 순간까지 어떤 순서로 코드가 실행되었는지를 보여 주는 기록입니다. 파이썬에서는 트레이스백(Traceback)이라고 부릅니다. 어떤 파일의 몇 번째 줄에서 문제가 생겼는지, 그 줄을 누가 불렀는지가 차례대로 적혀 있어서, 원인을 찾는 지도 역할을 합니다.
에러가 나는 예제 만들어 보기
직접 보는 것이 가장 빠르니 일부러 에러를 만들어 보겠습니다. 아래 코드를 test.py라는 이름으로 저장하세요.
python
def divide(a, b):
return a / b
def calculate():
result = divide(10, 0)
print(result)
calculate()
터미널에서 파일이 있는 폴더로 이동한 뒤 아래 명령으로 실행합니다. 윈도우에서는 python3 대신 python을 쓰면 됩니다.
python3 test.py
실행하면 아래와 비슷한 화면이 나옵니다. 파일 경로의 사용자이름 부분은 컴퓨터마다 다르게 보이고, 파이썬 버전에 따라 물결(~)과 ^ 표시는 보이지 않을 수도 있습니다.
Traceback (most recent call last):
File "/Users/사용자이름/Desktop/test.py", line 8, in <module>
calculate()
~~~~~~~~~^^
File "/Users/사용자이름/Desktop/test.py", line 5, in calculate
result = divide(10, 0)
File "/Users/사용자이름/Desktop/test.py", line 2, in divide
return a / b
~~^~~
ZeroDivisionError: division by zero
스택 트레이스 읽는 순서
핵심은 위에서부터 읽지 않고 맨 아래부터 읽는 것입니다.
- 맨 아래 줄을 먼저 봅니다. 여기에 에러의 종류와 이유가 적혀 있습니다. 예제에서는 ZeroDivisionError: division by zero 입니다. 0으로 나누려고 해서 생긴 에러라는 뜻입니다.
- 그 바로 위의 File 줄을 봅니다. 몇 번째 줄에서 에러가 났는지 알려 줍니다. 예제에서는 test.py의 2번째 줄, return a / b 입니다.
- 위로 올라가면서 그 코드를 누가 불렀는지 확인합니다. divide 함수는 calculate 함수의 5번째 줄에서, calculate 함수는 맨 아래 8번째 줄에서 불렸습니다.
즉 에러가 실제로 터진 곳은 맨 아래 쪽이고, 위쪽은 그곳까지 오게 된 길입니다. 그래서 가장 아래 줄과 그 위의 줄을 먼저 보면 대부분의 원인을 찾을 수 있습니다.
자주 만나는 에러 종류
초보자가 자주 만나는 에러 두 가지를 살펴봅니다.
첫 번째, TypeError
글자와 숫자를 더하려고 할 때 나오는 에러입니다. 예를 들어 아래 코드를 실행하면 에러가 납니다.
python
print("나이: " + 20)
실행하면 맨 아래 줄에 이런 메시지가 나옵니다.
TypeError: can only concatenate str (not "int") to str
글자(str)와 숫자(int)를 + 로 이을 수 없다는 뜻입니다. 숫자를 str()로 감싸서 글자로 바꾸면 해결됩니다.
python
print("나이: " + str(20))
두 번째, IndexError
리스트에서 없는 번호의 자리를 꺼내려고 할 때 나오는 에러입니다. 예를 들어 항목이 두 개인 리스트에서 세 번째 자리를 꺼내 보겠습니다.
python
fruits = ["사과", "바나나"]
print(fruits[2])
실행하면 맨 아래 줄에 이런 메시지가 나옵니다.
IndexError: list index out of range
리스트의 번호는 0부터 시작하므로 항목이 두 개이면 사용할 수 있는 번호는 0과 1뿐입니다. 번호 2는 범위를 벗어난 것이라서 에러가 납니다. 리스트에 항목이 몇 개 있는지 확인하고, 존재하는 번호를 사용하면 해결됩니다.
꼭 확인하세요. 위 코드와 에러 메시지는 제가 쓴 예시예요. 두 코드를 직접 실행해서 같은 에러 메시지가 나오는지 확인하세요. 다르면 실제로 나온 메시지로 고치세요.
에러 원인을 찾는 5단계
- 당황하지 말고 에러 화면 전체를 한 번 훑어봅니다.
- 맨 아래 줄에서 에러 종류와 이유를 읽습니다.
- 바로 위 File 줄에서 몇 번째 줄인지 확인합니다.
- 그 줄의 코드를 직접 열어서 오타나 잘못된 값이 없는지 봅니다.
- 그래도 모르겠으면 맨 아래 줄을 그대로 복사해서 검색합니다.
한 번에 하나씩만 고치고 다시 실행해 보는 것이 중요합니다. 여러 곳을 한꺼번에 바꾸면 무엇이 문제였는지 알 수 없게 됩니다.
에러를 줄이는 습관
에러를 완전히 없앨 수는 없지만 줄일 수는 있습니다. 코드를 길게 쓰고 한꺼번에 실행하지 말고 조금 쓸 때마다 실행해 보세요. 에러가 났을 때 어디서 났는지 범위가 좁아져서 훨씬 찾기 쉽습니다. 변수 이름은 알아보기 쉽게 짓고, 에러 메시지를 지우지 말고 그대로 읽는 습관을 들이세요.
이 글을 쓰면서 저도 위의 코드를 직접 저장하고 터미널에서 실행해 봤습니다. 글에서 설명한 것과 같은 ZeroDivisionError가 나왔고, 맨 아래 줄부터 읽으니 0으로 나눠서 생긴 에러라는 것을 바로 알 수 있었습니다. 처음에는 빨간 글씨가 많아서 당황했지만, 아래에서부터 한 줄씩 읽어 보니 생각보다 어렵지 않았습니다.
마무리
오늘은 에러 화면의 스택 트레이스를 읽는 순서와 자주 만나는 에러의 종류, 원인을 찾는 5단계를 알아봤습니다. 빨간 글씨는 무서운 것이 아니라 문제의 위치를 알려 주는 안내입니다. 맨 아래 줄부터 읽는 습관만 들여도 에러가 훨씬 덜 무섭게 느껴집니다. 일부러 에러를 만들어 읽어 보면서 천천히 익혀 보세요.
에러 종류별 해결 방법이 궁금하다면 아래 글도 함께 읽어 보세요.




댓글 0
첫 댓글을 남겨보세요.