2011-11-23 65 views
66

我想將錯誤的名稱和追溯詳細信息保存到變量中。這是我的嘗試。如何在一個變量中保存traceback/sys.exc_info()值?

import sys 
try: 
    try: 
     print x 
    except Exception, ex: 
     raise NameError 
except Exception, er: 
    print "0", sys.exc_info()[0] 
    print "1", sys.exc_info()[1] 
    print "2", sys.exc_info()[2] 

輸出:

0 <type 'exceptions.NameError'> 
1 
2 <traceback object at 0xbd5fc8> 

所需的輸出:

0 NameError 
1 
2 Traceback (most recent call last): 
    File "exception.py", line 6, in <module> 
    raise NameError 

P.S.我知道這可以使用traceback模塊輕鬆完成,但我想知道sys.exc_info()[2]對象在這裏的用法。

+2

你可能誤會了什麼是你的程序怎麼回事:你指的是什麼爲「sys.exc_info()[2]物體」追溯對象的實例(=您正在使用的追蹤模塊已經)。現在,您可以在不使用追蹤模塊中的輔助函數的情況下操作該對象,但這並不會改變您仍在使用它的事實。 :) – mac

+0

你試過打印sys.exc_info()[x] .__ str __()嗎? – zmbq

+1

So @mac請幫助我使用或不使用輔助函數來訪問此對象的值。 – codersofthedark

回答

96

這是我要做的事:

>>> import traceback 
>>> try: 
... int('k') 
... except: 
... var = traceback.format_exc() 
... 
>>> print var 
Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
ValueError: invalid literal for int() with base 10: 'k' 

你應該然而看一看在​​3210,因爲你可能會發現有更合適的方法,這取決於您要如何處理後您的變量...

+1

我正在尋找一種不使用追蹤模塊的方法。有沒有辦法打印這個對象引用的回溯細節? sys.exc_info()[2] – codersofthedark

+0

正確的,這就是爲什麼我認爲我們可以做一些像sys.exc_info()[2] .format_exc(),但這不工作..因此,我不知道如何從中提取價值追溯對象sys.exc_info()[2]。任何想法? – codersofthedark

+0

@dragosrsupercool - 「這就是爲什麼我認爲我們可以做一些像sys.exc_info()[2] .format_exc()」這沒有任何意義。你試圖調用跟蹤模塊函數,就好像它是跟蹤對象的方法一樣... – mac

12

如果您想方便地訪問模塊和函數名稱和行號,請​​使用traceback.extract_stack()

如果您只是想要一個看起來像traceback.print_stack()輸出的字符串,請使用''.join(traceback.format_stack())

請注意,即使使用''.join(),您也將得到一個多行字符串,因爲format_stack()的元素包含\n。見下面的輸出。

請記住import traceback

這是traceback.extract_stack()的輸出。爲了便於閱讀,添加了格式。

>>> traceback.extract_stack() 
[ 
    ('<string>', 1, '<module>', None), 
    ('C:\\Python\\lib\\idlelib\\run.py', 126, 'main', 'ret = method(*args, **kwargs)'), 
    ('C:\\Python\\lib\\idlelib\\run.py', 353, 'runcode', 'exec(code, self.locals)'), 
    ('<pyshell#1>', 1, '<module>', None) 
] 

這是''.join(traceback.format_stack())的輸出。爲了便於閱讀,添加了格式。

>>> ''.join(traceback.format_stack()) 
' File "<string>", line 1, in <module>\n 
    File "C:\\Python\\lib\\idlelib\\run.py", line 126, in main\n 
     ret = method(*args, **kwargs)\n 
    File "C:\\Python\\lib\\idlelib\\run.py", line 353, in runcode\n 
     exec(code, self.locals)\n File "<pyshell#2>", line 1, in <module>\n' 
10

sys.exc_info()返回與三個值(類型,值,回溯)的元組。

  1. 以下類型獲取異常的異常類型被處理
  2. 值是正在傳遞到異常類的構造函數的參數
  3. 回溯含有類似異常發生的位置等堆棧信息

對於實施例,在下面的程序

try: 

    a = 1/0 

except Exception,e: 

    exc_tuple = sys.exc_info() 

現在,如果我們打印元組的值將是這個。

  1. exc_tuple [0]的值將是 「ZeroDivisionError
  2. exc_tuple [1]的值將是 「零整數除法或模」(字符串作爲參數傳遞給異常類)
  3. exc_tuple [2]的值將是「在(某些存儲器地址)引用對象

上述細節也可以通過簡單地取出首席以字符串格式排除異常。

print str(e) 
相關問題