티스토리 뷰

반응형

파이썬을 다루는 사람이라면, 다음과 같은 문구를 매우 매우 많이 보았을 것이다.

Traceback (most recent call last):
  File "error.py", line 1, in <module>
    print(4/0)
ZeroDivisionError: division by zero

근데, 이 문구를 자세히 들여다보면 첫 번째 줄에 Traceback부터 시작한다. 이 친구는 무엇을 하는 친구일까? 함께 알아보도록 하자.

thumbnail


1. Traceback이란?

Traceback은 파이썬에서 특정 지점에서 함수 호출에 관한 정보를 담고있다고 생각하면 된다. 다른 언어에서는 stack trace, backtrace 등등 여러 용어가 사용되지만, 파이썬에서는 traceback을 사용한다.

 

만약, 파이썬에서 오류가 발생한다면, traceback의 현재 상태를 출력하고 오류를 콘솔에 띄운다. 만약 다음과 같이 잘못된 코드를 작성하였다고 하자.

 

1
2
3
4
def hello(name, msg):
    print(name, ":", meg)
 
hello("Jinho""hi!")
cs

 

위의 코드에서 print의 인자로 'msg'를 넘겨야 하지만, 오타로 'meg'를 넘겼고, meg 변수는 함수 안에 정의되지 않았기에 오류가 발생한다. 이대로 실행한다면 다음과 같은 Traceback을 마주칠 수 있을 것이다. (파이썬 3.10 기준일 때의 출력이다. 이전 버전의 경우 다르게 표시될 수 있다.)

Traceback (most recent call last):
  File "error.py", line 4, in <module>
    hello("Jinho", "hi!")
  File "error.py", line 2, in hello
    print(name, ":", meg)
NameError: name 'meg' is not defined. Did you mean: 'msg'?

Traceback를 출력한 정보는 오류에 대한 모든 정보를 담아내고 있다. 이 정보를 해석하여 보자.


2. Traceback 읽는 방법

Traceback 오류 메시지를 읽을 때는 밑에서부터 읽으면 된다. 위의 오류 메시지를 중심으로 살펴보자.

NameError: name 'meg' is not defined. Did you mean: 'msg'?

먼저 Traceback의 마지막 줄은 에러 메시지에 관한 줄이다. 어떤 예외처리가 진행되었고, 이에 대한 설명을 적어 놓는 줄이다. 

 

이 경우 현재 'NameError'라는 예외 처리가 발생하였고, 이에 대한 설명으로 'meg'라는 이름이 정의되지 않았다고 하고 있다. 이 메시지는 예외가 왜 발생하였는지에 대한 중요한 정보를 담고 있다.


이제 위로 올라가서 다음 항목을 살펴보자.

  File "error.py", line 2, in hello
    print(name, ":", meg)

그 위의 줄은 함수 호출에 관한 내용을 담고있다.  위로 올라갈수록 더 상위 함수를 나타내며, 현재는 맨 밑줄이기에 오류가 발생한 부분에 관한 정보를 확인할 수 있다.

 

보통 두 줄 단위로 해석하면 된다.

 

첫 번째 줄은 파일명, 줄 번호, 모듈 이름 혹은 호출한 함수와 관련된 정보를 담고 있다.

 

이 경우 현재 가장 안 쪽의 함수인 print에서 오류가 발생했다는 것을 확인할 수 있으며, 파일명 "error.py"의 2번째 줄의 hello 함수에서 오류가 나타났다고 볼 수 있다.

 

두 번째 줄은 실제 코드를 나타낸다.


가장 맨 윗줄의 오류를 확인하여보자.

Traceback (most recent call last):
  File "error.py", line 4, in <module>
    hello("Jinho", "hi!")

가장 맨 윗줄도 같은 방법으로 읽으면 되지만, 첫 번째 줄의 <module>로 대체되어 있다. 최상위 코드를 나타낸다고 생각하면 된다.


1
2
3
4
5
6
7
8
9
def is_odd(num):
    if num % 2 == 0:
        raise ValueError(str(num) + ' is not odd!')
    print(num)
 
try:
    is_odd(4)
except Exception as e:
    is_odd(6)
cs

 

만약 위의 코드와 같이 여러 개의 오류가 발생할 경우 다음과 같은 오류 메시지를 발견할 수 있다.

Traceback (most recent call last):
  File "error.py", line 7, in <module>
    is_odd(4)
  File "error.py", line 3, in is_odd
    raise ValueError(str(num) + ' is not odd!')
ValueError: 4 is not odd!

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "error.py", line 9, in <module>
    is_odd(6)
  File "error.py", line 3, in is_odd
    raise ValueError(str(num) + ' is not odd!')
ValueError: 6 is not odd!

만약 오류 난 곳이 두 곳 이상이라면, 'During... another exception occurred"라는 문구와 함께 오류난 다른 곳에서의 Traceback까지 보여준다. 이 경우 두 곳 이상을 디버깅하면 된다.


3. Traceback을 프로그램을 끝내지 않고 알아내려면?

만약, 파이썬을 끝내지 않고 프로그램 traceback에 대한 정보를 얻으려면, traceback의 모듈을 사용하면 된다.

 

일반적으로 오류 처리에 대한 정보는 다음과 같이 try-except문을 활용하거나, assert문을 활용하여 알 수 있다. 다만, traceback을 사용한다면 여태까지의 함수 호출에 대한 정보를 더 자세히 알 수 있다.

 

먼저, 일반적인 try-except문을 활용하여 짝수일 시 예외 처리(ValueError)를 하도록 작성한 코드이다.

 

1
2
3
4
5
6
7
8
9
10
11
def is_odd(num):
    if num % 2 == 0:
        raise ValueError(str(num) + ' is not odd!')
    print(num)
 
try:
    is_odd(4)
except Exception as e:
    print("Exception! :", e)
 
# Exception! : 4 is not odd!
cs

 

 

이제, traceback모듈을 활용하여 이 함수의 전체적인 traceback을 확인하도록 하자. traceback 모듈을 import 하고 이에 대한 Traceback을 print을 활용해 출력하여보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import traceback
 
def is_odd(num):
    if num % 2 == 0:
        raise ValueError(str(num) + ' is not odd!')
    print(num)
 
try:
    is_odd(4)
except Exception as e:
    print(traceback.format_exc())
    
# Traceback (most recent call last):
#   File "error.py", line 9, in <module>
#     is_odd(4)
#   File "error.py", line 5, in is_odd
#     raise ValueError(str(num) + ' is not odd!')
# ValueError: 4 is not odd!
cs

 

출력의 차이가 보이는가?

 

현재 ValueError가 띄워짐에 따라 traceback에 기록된 내용 보고, 이후 오류 메시지를 저장하지 싶다면, traceback의 format_exc() 메서드를 활용하여 가능하다.

 

Trackback 모듈에 관한 내용은 난이도가 조금 있으니 별도의 포스팅으로 찾아뵙겠다.

 

 

반응형
댓글
Total
Today
Yesterday
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함