Python 获取对当前异常的引用

Python 获取对当前异常的引用,python,debugging,exception,pdb,ipdb,Python,Debugging,Exception,Pdb,Ipdb,然后我可以使用exc来分析它 如何轻松地获得当前有效异常的引用?这也让我沮丧了一段时间。我最终找到了答案,并给出了详细的解释 简而言之,使用魔法前缀(!sys.exc_info()): [4]中的:1/0 --------------------------------------------------------------------------- ZeroDivisionError回溯(最近一次呼叫上次) ... ipdb>!系统执行信息() (,AttributeError(“'exc

然后我可以使用
exc
来分析它


如何轻松地获得当前有效异常的引用?

这也让我沮丧了一段时间。我最终找到了答案,并给出了详细的解释

简而言之,使用
魔法前缀(
!sys.exc_info()
):

[4]中的
:1/0
---------------------------------------------------------------------------
ZeroDivisionError回溯(最近一次呼叫上次)
...
ipdb>!系统执行信息()
(,AttributeError(“'exceptions.ZeroDivisionError'对象没有属性'\u render\u traceback'),)

这基本上告诉调试器:“猜测是不必要的。我正在键入的是python代码”,从而防止调试器试图猜测“sys”是什么意思,在这个过程中会引发一些内部异常,覆盖
sys.exc_info()
,用于保存原始异常。

看起来这里可能已经给出了答案:@AaronD,链接中的答案仅在
pdb
中有效,而不是
ipdb
…@AaronD,当试图检索
sys时,我得到了
AttributeError:“module”对象没有属性“last\u value”
。last\u value
中,除了
:谢谢,这很有效。我希望有一个内置的
ipdb
命令,否则我必须键入:
!导入系统;sys.exc_info()
@warwaruk您可以在
.pdbrc
中定义别名,谢谢!最后我放了
别名exc_info!导入系统;sys.exc_info()。要分配给变量,可以使用
!导入系统;exc=sys.exc_info()
然后您可以浏览它,导入
回溯
并打印它,等等。非常有用!。仅供参考,你从何处获得想法的链接不再指向任何相关内容。
$ ./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> 
try:
    do_something_that_raises_an_exception()
except Exception as exc:
    import ipdb; ipdb.set_trace()
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>)