2010-01-02 64 views
1
try: 
    raise TypeError 
except TypeError: 
    try: 
     tb = sys.exc_info()[2] 
     TracebackType = type(tb) 
     FrameType = type(tb.tb_frame) 
    except AttributeError: 
     # In the restricted environment, exc_info returns (None, None, 
     # None) Then, tb.tb_frame gives an attribute error 
     pass 
    tb = None; del tb 

我完全不明白這段代碼。它的目的是什麼?這些來自types.py的代碼是做什麼的?

回答

4

獲取一個回溯對象和一個框架對象是一種技巧,以便TracebackType和FrameType可以被分配它們的類型。它只是引發異常,以便能夠捕捉異常,然後從sys.exc_info獲取回溯和幀。

0

該代碼試圖找出sys.exc_info()返回的回溯所使用的類型,並將這些類型分配給變量TracebackTypeFrameType

爲此,它首先需要引發異常並捕獲它(TypeError),以便sys.exc_info()可以返回此異常的回溯。然後檢查這個回溯來確定類型。最後,本地tb變量將被刪除,以避免不必要的循環引用(請參閱documentation中的警告sys.exc_info())。

0

看起來好像這個代碼是用來獲取調用堆棧的。如果你研究了http://pyref.infogami.com/sys.exc_info的exc_info函數,你會發現函數返回一個3值的元組,其中第三個是一個Traceback對象。該對象包含隨後顯示的調用堆棧信息。