2015-11-23 86 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