2021년 1월 31일 일요일

python exception 스택을 출력 하는 방법


python에서 exception stack을 출력하는 방법은 trackback class를 이용하면 간단하게 처리가능합니다.

아래 두가지 방법이 있습니다. 두가지 방법을 하나의 예제로 묶었습니다.


https://github.com/donarts/sourcecode/blob/main/python/example/4_printstack.py


import traceback
import sys
A = []
try:
value = A[-1]
except:
# printing stack trace
print("1. print_exc")
traceback.print_exc()
print("2. print_exception")
type, value, tb=sys.exc_info()
traceback.print_exception(type, value, tb)
print("end of program")


실행 결과

1. print_exc
Traceback (most recent call last):
  File "4_printstack.py", line 7, in <module>
    value = A[-1]
IndexError: list index out of range
2. print_exception
Traceback (most recent call last):
  File "4_printstack.py", line 7, in <module>
    value = A[-1]
IndexError: list index out of range
end of program



첫번째는 일반적으로 많이 사용하는 방법입니다. 해당 방법은 현재 기준으로 stack를 표시하기 때문에 사용하는것이 제한적입니다. 두번째는 변수를 받아서 다른곳에서 그때의 시점을 기록 할 수 있게 됩니다. 좀 복잡하더라도 두번째 방법이 범용성이 높습니다.

두가지 방법을 하더라도 로그에 기록되지는 않습니다. 로그로 기록하려면 string형태의 값이 있어야 합니다. 로그 기록은 아래 예제를 참고하세요


https://github.com/donarts/sourcecode/blob/main/python/example/4_printstack_log.py


import logging
import traceback
import sys
logger = logging.getLogger('log')
A = []
try:
value = A[-1]
except:
# printing stack trace
type, value, tb=sys.exc_info()
ex_traceback=traceback.format_exception(type, value, tb)
print("1. print")
for line in ex_traceback:
print(line)
print("2. log print")
tb_lines = [line.rstrip('\n') for line in ex_traceback]
logger.log(logging.ERROR,tb_lines)
print("end of program")

실행결과

1. print
Traceback (most recent call last):

  File "4_printstack_log.py", line 10, in <module>
    value = A[-1]

IndexError: list index out of range

2. log print
['Traceback (most recent call last):', '  File "4_printstack_log.py", line 10, in <module>\n    value = A[-1]', 'IndexError: list index out of range']
end of program


처음 예제를 응용하여 call stack을 list형태로 print 하는 방법을 알아봤으며, 두번째는 로그를 출력하도록 해봤습니다. 

for line in ex_traceback:
print(line)

여기에서 print 대신 log 출력으로 바꾸어도 됩니다.




















댓글 없음:

댓글 쓰기