[Python] cgitb로 자세한 오류를 찍어 봅니다 Develop Tip

파이썬을 주 언어로 사용한지 십년이 다 되어 가는데도 아직도 제대로 모르고 있는
부분이 많다는 생각입니다. 그것도 표준 라이브러리를 말이지요.

암튼 간단히 다음의 프로그램을 봅니다.
(PyMOTW 의 cgitb 내용을 참조했습니다.)


def func1(arg1):
    local_var = arg1 * 2
    return func2(local_var)

def func2(arg2):
    local_var = arg2 + 2
    return func3(local_var)

def func3(arg3):
    local_var = arg2 / 2
    return local_var

func1(1)


라는 파이썬 프로그램을 돌리면,

$ python cgitb_basic_traceback.py

Traceback (most recent call last):
  File "cgitb_basic_traceback.py", line 22, in <module>
    func1(1)
  File "cgitb_basic_traceback.py", line 12, in func1
    return func2(local_var)
  File "cgitb_basic_traceback.py", line 16, in func2
    return func3(local_var)
  File "cgitb_basic_traceback.py", line 19, in func3
    local_var = arg2 / 2
NameError: global name 'arg2' is not defined

위와 같이 오류가 나옵니다.
뭐 이걸로도 충분하다고 생각하실 수가 있지만,
더 자세히 로그만 보고도 판단할 필요가 있는데 
그러기 위해서는 뭐 이것 저것 해 줄 것 없이,

import cgitb
cgitb.enable(format='text')

def func1(arg1):
    local_var = arg1 * 2
    return func2(local_var)

def func2(arg2):
    local_var = arg2 + 2
    return func3(local_var)

def func3(arg3):
    local_var = arg2 / 2
    return local_var

func1(1)

위와 같이 

import cgitb
cgitb.enable(format='text')

라는 두 줄만 추가해 줍니다.

그러면 그 결과로,

$ python cgitb_extended_traceback.py

<type 'exceptions.NameError'>
Python 2.7.2: /Users/dhellmann/Envs/pymotw/bin/python
Thu Feb 21 06:35:39 2013

A problem occurred in a Python script.  Here is the sequence of
function calls leading up to the error, in the order they occurred.

 /Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in <module>()
   21 def func3(arg3):
   22     local_var = arg2 / 2
   23     return local_var
   24
   25 func1(1)
func1 = <function func1>

 /Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in func1(arg1=1)
   13 def func1(arg1):
   14     local_var = arg1 * 2
   15     return func2(local_var)
   16
   17 def func2(arg2):
global func2 = <function func2>
local_var = 2

 /Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in func2(arg2=2)
   17 def func2(arg2):
   18     local_var = arg2 + 2
   19     return func3(local_var)
   20
   21 def func3(arg3):
global func3 = <function func3>
local_var = 4

 /Users/dhellmann/Documents/PyMOTW/src/PyMOTW/cgitb/cgitb_extended_traceback.py in func3(arg3=4)
   20
   21 def func3(arg3):
   22     local_var = arg2 / 2
   23     return local_var
   24
local_var undefined
arg2 undefined
<type 'exceptions.NameError'>: global name 'arg2' is not defined
    __class__ = <type 'exceptions.NameError'>
    __delattr__ = <method-wrapper '__delattr__' of exceptions.NameError object>
    __dict__ = {}
    __doc__ = 'Name not found globally.'
    __format__ = <built-in method __format__ of exceptions.NameError object>
    __getattribute__ = <method-wrapper '__getattribute__' of exceptions.NameError object>
    __getitem__ = <method-wrapper '__getitem__' of exceptions.NameError object>
    __getslice__ = <method-wrapper '__getslice__' of exceptions.NameError object>
    __hash__ = <method-wrapper '__hash__' of exceptions.NameError object>
    __init__ = <method-wrapper '__init__' of exceptions.NameError object>
    __new__ = <built-in method __new__ of type object>
    __reduce__ = <built-in method __reduce__ of exceptions.NameError object>
    __reduce_ex__ = <built-in method __reduce_ex__ of exceptions.NameError object>
    __repr__ = <method-wrapper '__repr__' of exceptions.NameError object>
    __setattr__ = <method-wrapper '__setattr__' of exceptions.NameError object>
    __setstate__ = <built-in method __setstate__ of exceptions.NameError object>
    __sizeof__ = <built-in method __sizeof__ of exceptions.NameError object>
    __str__ = <method-wrapper '__str__' of exceptions.NameError object>
    __subclasshook__ = <built-in method __subclasshook__ of type object>
    __unicode__ = <built-in method __unicode__ of exceptions.NameError object>
    args = ("global name 'arg2' is not defined",)
    message = "global name 'arg2' is not defined"

The above is a description of an error in a Python program.  Here is
the original traceback:

Traceback (most recent call last):
  File "cgitb_extended_traceback.py", line 25, in <module>
    func1(1)
  File "cgitb_extended_traceback.py", line 15, in func1
    return func2(local_var)
  File "cgitb_extended_traceback.py", line 19, in func2
    return func3(local_var)
  File "cgitb_extended_traceback.py", line 22, in func3
    local_var = arg2 / 2
NameError: global name 'arg2' is not defined

위와 같이 로그 자체 만으로도 어느정도 파악이 가능할 정도의 자세한 내용을 보여줍니다.

구체적인 내용으로

* 전체 경로를 보여주고
* 스택에서 호출된 함수의 패러미터 값을 각각 보여주고
* 에러가 발생한 부분의 다섯줄 정도씩 보여주고
* 에러를 발생시킨 구문의 변수 값을 보여줍니다.

cgitb 가 cbi라는 이름이 이야기 하듯이
cgi 프로그램 (20년 정도도 더 된 원시시대 이야기 이죠)을 하다가 CGI 트레이스백 결과를
좀더 자세히 보기 위해 만들어진 것인데 표준 라이브러리 이므로 CGI 라는 것 대신
위의 기능으로 활용하면 될 것 같습니다.
(format에 html 로 지정하면 html결과가 나온다는 것으로 보아 cgi 랑 관계된 것이 맞네요 ^^)


어느 분께는 도움이 되셨기를... ​




덧글

댓글 입력 영역

구글애드텍스트