2015-11-23 45 views
1

我试图从回溯中提取信息,但我收到错误。如何从追踪中获取函数和模块名称?

我想摆脱以下示例代码中的call变量。我想搜索回溯并获取被调用的套接字模块函数的名称。我怎样才能做到这一点?

try: 
    sock = None 
    call = "socket" 
    sock = socket.socket(family, stype) 
    call = "setsockopt" 
    set_my_options(): 
    call = "connect" 
    sock.connect(addr) 
except OSError as err: 
    if sock is not None: 
     sock.close() 
    # call = name of the failed socket.XXX() call 
    raise RPCError("{} failed".format(call)) 

我试图开始(仅Python3):

stack = traceback.extract_stack(err.__traceback__) 

或(Python2和Python3)

stack = traceback.extract_stack(sys.exc_info()[2]) 

,但得到:

AttributeError: 'traceback' object has no attribute 'f_lineno'


EDIT1

固定忽略的错误后,这是我现在有:

.... 
except OSError as err: 
    tb = traceback.extract_tb(err.__traceback__) 
    for tb_entry in reversed(tb): 
     if tb_entry[0] == __file__: 
      failed = tb_entry[3] 
      break 
    .... 

它提取的最后一个回溯条目,其中执行的代码仍然是在当前文件。一个外部模块的内部结构不会很有帮助。结果是一行代码,例如sock.connect(addr)。不完全是我想要的,但接近。

回答

2

通过这种方式,您可以检索函数的名称和模块名称。

import traceback 

def func(): 
    try: 
     # My code 
    except Exception as e: 
     stack = traceback.extract_stack() 
     (filename, line, procname, text) = stack[-1] 
     print procname # function name 
     print filename # module name 
+0

我现在明白了:我把'extract_tb'和'extract_stack'搞混了。前者采用tb的说法,但后者不适用。 – VPfB

+0

你的回答确实有帮助。给我一些时间来看看其他答案(如果有的话),然后我会接受最好的一个,可能是你的。 – VPfB