2012-04-11 41 views
9

我感到困惑的兩個對象之間的區別:'inspect.trace()``VS traceback`

  • 通過inspect.trace()返回幀,而一個異常被處理
  • 返回的追溯列表sys.exc_info()[2](或調用sys.excepthook傳遞)

執行兩個對象包含相同的信息,只是組織成不同的數據結構?如果不是,那麼其他人不具備的是什麼?

+0

爲什麼不通過引發和捕獲異常來**測試**,並顯示每個異常的結果? – 2012-04-11 23:42:52

+0

我試過了,但是他們沒有打印出來(只是)..所以我想不出如何做這個測試。 – max 2012-04-12 02:59:01

+0

你有沒有考慮在結果上使用'dir()'?或'help()'? – 2012-04-12 03:18:16

回答

7

從inspect.trace的文檔:

檢查。 跟蹤([上下文])

返回當前幀和當前正在處理異常的幀之間的堆棧的幀記錄列表。列表中的第一個條目表示調用者;最後一個條目表示引發異常的位置。

這表明它提供了一個很好的方法來分割和骰子從sys.exc_info()[2]你得到的幀。

其中,如果你看看源:

def trace(context=1): 
    """Return a list of records for the stack below the current exception.""" 
    return getinnerframes(sys.exc_info()[2], context) 

(同爲3.22.7),正是它,但它傳遞通過getinnerframes,其中有一些有用的信息詮釋它,每文檔字符串:

獲取回溯幀和所有較低幀的記錄列表。

每條記錄​​都包含一個框架對象,文件名,行號,函數名稱,上下文行的列表以及上下文中的索引。

而且,因爲我很好奇是什麼,其實就是:

import sys 
import inspect 
from pprint import pprint 


def errorer(): 
    raise Exception('foo') 

def syser(): 
    try: 
     errorer() 
    except Exception, e: 
     tb = sys.exc_info()[2] 
     print tb.tb_frame 
     print tb.tb_lasti 
     print tb.tb_lineno 
     print tb.tb_next 

def inspecter(): 
    try: 
     errorer() 
    except Exception, e: 
     pprint(inspect.trace()) 

其中,從提示調用時,同時回顧,許多這些領域和對象有easy-to-find定義:

>>> syser() 
<frame object at 0x1441240> 
6 
10 
<traceback object at 0x13eb3b0> 
>>> inspecter() 
[(<frame object at 0x14a5590>, 
    '/tmp/errors.py', 
    22, 
    'inspecter', 
    None, 
    None), 
(<frame object at 0x14a21b0>, 
    '/tmp/errors.py', 
    8, 
    'errorer', 
    None, 
    None)] 

(行號蹦來跳去,因爲我與格式混亂)

inspect.trace()顯然更好一點。

相關問題