9
我感到困惑的兩個對象之間的區別:'inspect.trace()``VS traceback`
- 通過
inspect.trace()
返回幀,而一個異常被處理 - 返回的追溯列表
sys.exc_info()[2]
(或調用sys.excepthook
傳遞)
執行兩個對象包含相同的信息,只是組織成不同的數據結構?如果不是,那麼其他人不具備的是什麼?
我感到困惑的兩個對象之間的區別:'inspect.trace()``VS traceback`
inspect.trace()
返回幀,而一個異常被處理sys.exc_info()[2]
(或調用sys.excepthook
傳遞)執行兩個對象包含相同的信息,只是組織成不同的數據結構?如果不是,那麼其他人不具備的是什麼?
從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.2或2.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()
顯然更好一點。
爲什麼不通過引發和捕獲異常來**測試**,並顯示每個異常的結果? – 2012-04-11 23:42:52
我試過了,但是他們沒有打印出來(只是)..所以我想不出如何做這個測試。 –
max
2012-04-12 02:59:01
你有沒有考慮在結果上使用'dir()'?或'help()'? – 2012-04-12 03:18:16