2013-10-06 23 views
12

有沒有辦法在pdb /進入pdb之前檢查最後一個異常? (使用python 2.7.5)。獲取pdb中的最後一個例外

立即(是的,我沒有輸入任何其他命令)在我的代碼中引發異常後,我做了sys.exc_info();這隻會導致(None, None, None)。在這一點上,我可以做pdb.pm(),並且pdb從引發異常的時候開始。

我想能夠檢查這個異常對象(它沒有被存儲在一個變量被引發之前)。

中沒有任何http://docs.python.org/2/library/pdb.htmlhttp://docs.python.org/2/library/sys.html

編輯顯然是有幫助的:我知道set_trace。我想在修改代碼之前檢查異常。

+0

[獲取對當前異常的引用](https://stackoverflow.com/questions/20797923/get-reference-to-the-current-exception)有一個適用於我的用例的答案:獲取最後拋出的當用pdb逐步完成時是個例外。 – zneak

回答

7

可以使用sys.last_value

>>> no_such_var 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'no_such_var' is not defined 
>>> import sys 
>>> sys.last_value 
NameError("name 'no_such_var' is not defined",) 
>>> sys.last_value.args 
("name 'no_such_var' is not defined",) 

>>> no_such_var 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'no_such_var' is not defined 
>>> import pdb, sys 
>>> pdb.set_trace() 
--Return-- 
> <stdin>(1)<module>()->None 
(Pdb) sys.last_value 
NameError("name 'no_such_var' is not defined",) 

注:該解決方案是不完美的。當未處理異常並且解釋器打印錯誤消息和堆棧回溯時,該值被設置。例如,如果使用try .. except ..捕獲異常,則未設置sys.last_value

+16

我得到:'*** AttributeError:'module'object has no attribute'last_value'' – claymation

+0

@claymation,如果沒有異常,則不設置該屬性。執行導致異常的語句。例如:'1/0' – falsetru

+8

@falsetru' - > print 1/0','(Pdb)n','ZeroDivisionError:'整數除法或模數除法','(Pdb)import sys','( (python 2.6) – Izkata

4

這是你在找什麼?

import pdb 
try: 
    1/0 
except Exception as err: 
    pdb.set_trace() 

% test.py 
--Return-- 
> /home/unutbu/pybin/test.py(8)<module>()->None 
-> pdb.set_trace() 
(Pdb) err 
ZeroDivisionError('integer division or modulo by zero',) 
(Pdb) quit 

如果你不希望修改在異常起源的代碼,你可以改爲重新定義sys.excepthook

import pdb 
import sys 
def excepthook(type, value, traceback): 
    pdb.set_trace() 
sys.excepthook = excepthook 

1/0 

% test.py 
--Return-- 
> /home/unutbu/pybin/test.py(7)excepthook()->None 
-> pdb.set_trace() 
(Pdb) type 
<type 'exceptions.ZeroDivisionError'> 
(Pdb) value 
ZeroDivisionError('integer division or modulo by zero',) 
(Pdb) traceback 
<traceback object at 0xb774f52c> 
(Pdb) 
+0

謝謝,這太好了。 – Marcin

+0

這不適用於我... – Ben