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