코드로 우주평화

python _ traceback 에러 메시지 핸들링하기 본문

나는 이렇게 학습한다/Debug

python _ traceback 에러 메시지 핸들링하기

daco2020 2022. 9. 24. 16:36

traceback 이란?

파이썬으로 개발을 하다보면 traceback 이란 단어를 많이 접하게 된다.

 

traceback은 역 추적 이란 뜻으로 해당 에러가 어디서부터 발생했는지 우리에게 알려준다.

 

예를들어 다음처럼 빈 dictionary에 “값 내놔” 라는 key를 호출하면, 해당 key가 없기 때문에 KeyError가 발생한다.

dict = {}
dict["값 내놔"]
Traceback (most recent call last):
  File "example.py", line 2, in <module>
    dict["값 내놔"]
KeyError: '값 내놔'

위의 메시지로 보자면 KeyError가 line 2에서 발생했음을 알 수 있다.

 

 

이처럼 에러 메시지는 디버깅을 할 때 매우 유용하다.

 

하지만 에러가 언제 발생할지 우리는 알 수 없기 때문에 정작 에러 메시지를 보지 못하거나 혹은 프로그램이 다운되고 나서야 발견한다.

 

 

그렇다면, 에러가 발생할 때 프로그램 종료없이 에러 메시지만 알림으로 받아 볼 수는 없을까?

 

이와 관련하여 여러 솔루션 툴이 있지만, 오늘은 파이썬에서 간단히 사용해볼 수 있는 traceback 모듈에 대해 설명해보겠다.

 

 

 

 

 

traceback 사용하기

먼저 스크립트 상단에 traceback 모듈을 import 한다.

import traceback

 

 

try: ~ except:traceback.format_exc()를 사용하여 키에러를 발생시키는 함수를 만들어보자.

def 키에러발생함수():
    dict = {} # 빈 dictionary 생성

    try:
        return dict["키에러go!"] # key가 없기 때문에 KeyError가 발생
    except KeyError: # KeyError 가 발생한다면 예외처리
        return traceback.format_exc() # traceback 메시지를 문자열로 반환

메시지 = 키에러발생함수()
print(메시지) # 메시지 출력

 

 

스크립트를 실행해보면 다음의 결과가 나온다.

Traceback (most recent call last):
  File "example.py", line 5, in 키에러발생함수
    return dict["키에러go!"]
KeyError: '키에러go!'

결과를 보면 에러 메시지가 잘 출력되었다.

 

 

 

 

 

traceback 왜 사용할까?

여기까지만 보면 기존 에러 메시지와 무슨 차이가 있는지 궁금할 것이다.

 

 

첫 번째

에러 메시지를 확인하고 싶지만 프로그램 종료는 원하지 않을 때 사용한다.

 

보통 python에서 에러가 발생하면 그 즉시 프로그램이 종료된다. 하지만 위 예제 코드는 'except' 예외처리 이기 때문에 프로그램을 종료하지 않는다. 단지 traceback 모듈을 통해 에러 메시지를 가져와 문자열로 출력할 뿐이다.

 

 

 

두 번째

에러 메시지를 가공하여 원하는대로 사용할 수 있다.

 

에러 메시지가 너무 길다면 자르거나 생략할 수 있다. 원하는 포맷을 만들어 그 안에 메시지를 넣을 수도 있다. 몇몇 키워드만 다른 단어로 치환할수도 있다. 이처럼 사용자 입맛에 맞게 에러 메시지를 가공할 수 있다.

 

이렇게 가공한 메시지는 슬랙이나 디스코드 같은 채널에도 공유하여 알림 메시지를 전달할수도 있다.!

 

 

 

'알림 메시지'에 대해 아래 간단한 응용예제를 준비했다.

 

 

 

 

 

traceback 응용하기

메시지 가공하기

메시지는 문자열이므로 원하는대로 가공하여 반환하자.

 

아래는 replace 메서드를 사용하여 "KeyError"를 "키 에러"로 바꾸고, 마지막 줄에는 "넌 할 수 있어!"라는 응원 메시지?를 추가했다.

dict = {}

try:
    dict["키에러go!"]
except KeyError:
    메시지 = traceback.format_exc()
    가공메시지 = f"{메시지.replace('KeyError', '키 에러')}\\n넌 할 수 있어!"

print(가공메시지)

 

 

출력 결과

Traceback (most recent call last):
  File "example.py", line 4, in <module>
    dict["키에러go!"]
키 에러: '키에러go!'

넌 할 수 있어!

 

 

 

알림 보내기

가공한 메시지를 팀 동료들에게 공유할 수 있도록 알림 메시지를 보내보자.

 

아래는 디스코드 채널로 알림을 보내는 함수이다. (여기서는 흐름만 설명하고 디스코드 알림에 대한 자세한 구현은 다음 기회에 설명하겠다)

from config import DISCORD_WEBHOOK_URL

def send_message_to_discord(message: str) -> None:
    requests.post(DISCORD_WEBHOOK_URL, data={"content": message})

 

 

기존 코드에 디스코드 알림 함수를 추가한다. (send_message_to_discord)

dict = {}

try:
    dict["키에러go!"]
except KeyError:
    메시지 = traceback.format_exc()
    가공메시지 = f"{메시지.replace('KeyError', '키 에러')}\\n넌 할 수 있어!"
		
    send_message_to_discord(가공메시지) # 디스코드 채널로 알림을 보낸다.

 

 

이제 실행을 해보면?

 

 

 

실제 디스코드 채널에 에러 메시지가 떴다! 야호~😚

 

 

 

 

 

요약

  • traceback 모듈을 사용하면 에러 메시지를 가져올 수 있다.
  • except: 를 이용하면 프로그램을 종료하지 않고 에러 메시지를 가져올 수 있다.
  • 가져온 에러 메시지는 가공할 수 있으며, 외부 알림으로 보내는 등 다양하게 사용할 수 있다.

 

 


 

레퍼런스

 

traceback — 스택 트레이스백 인쇄와 조회 — Python 3.10.7 문서

traceback — 스택 트레이스백 인쇄와 조회 소스 코드: Lib/traceback.py 이 모듈은 파이썬 프로그램의 스택 트레이스를 추출, 포맷 및 인쇄하는 표준 인터페이스를 제공합니다. 스택 트레이스를 인쇄할

docs.python.org