如何从追溯中获取函数和模块名称?

时间:2015-11-23 14:26:58

标签: python

我正在尝试从追溯中提取信息,但我收到了错误。

我想摆脱以下示例代码中的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'对象没有属性'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)。不完全是我想要的,但接近。

0 个答案:

没有答案