$ ./runtests.py -v tests/managers/test_customer.py:CustomerManagerTest.test_register_without_subscription --ipdb
...
test_register_without_subscription (tests.managers.test_customer.CustomerManagerTest) ...
- TRACEBACK --------------------------------------------------------------------
Traceback (most recent call last):
File "/usr/lib/python2.7/unittest/case.py", line 331, in run
testMethod()
File "*****/tests/managers/test_customer.py", line 198, in test_register_without_subscription
1/0
ZeroDivisionError: integer division or modulo by zero
--------------------------------------------------------------------------------
> *****/tests/managers/test_customer.py(198)test_register_without_subscription()
197 def test_register_without_subscription(self):
--> 198 1/0
199 ...
ipdb> import sys
ipdb> sys.exc_info()
(<type 'exceptions.AttributeError'>, AttributeError("Pdb instance has no attribute 'do_sys'",), <traceback object at 0x47eb908>)
ipdb>
我在ipdb help
中找不到任何显示当前异常的命令。
执行import sys; print sys.exc_info()
不起作用。
目前我这样做:
try:
do_something_that_raises_an_exception()
except Exception as exc:
import ipdb; ipdb.set_trace()
然后我可以与exc
一起分析它。
如何轻松获取对当前有效例外的引用?
答案 0 :(得分:21)
这让我有点沮丧。我最终找到了答案here,以及一个很好的详细解释。
简短的回答是,使用!
魔术前缀(!sys.exc_info()
):
In [4]: 1/0
---------------------------------------------------------------------------
ZeroDivisionError Traceback (most recent call last)
...
ipdb> !sys.exc_info()
(<type 'exceptions.AttributeError'>, AttributeError("'exceptions.ZeroDivisionError' object has no attribute '_render_traceback_'",), <traceback object at 0x101c55fc8>)
这基本上告诉调试器:“猜测不是必需的。它是我正在键入的python代码”,因此阻止它试图猜测“sys”是什么意思,在这个过程中,一些内部异常是提升,覆盖sys.exc_info()
,曾经保留原来的例外。