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)
。不完全是我想要的,但接近。
我现在明白了:我把'extract_tb'和'extract_stack'搞混了。前者采用tb的说法,但后者不适用。 – VPfB
你的回答确实有帮助。给我一些时间来看看其他答案(如果有的话),然后我会接受最好的一个,可能是你的。 – VPfB