我确定您发现自己处在这种情况下,并且我怀疑没有办法摆脱这种情况。
假设您运行了一些引发异常的python代码,那么您想对其进行调查,但是在执行此操作时意外地引发了另一个异​​常。如果现在尝试进行事后调试,您将看到后一个异常的回溯。我的问题是,前者会永远消失吗?

例子:

def my_buggy_function(x):
    y = x + 1
    raise RuntimeError

步骤1:我提出了一个错误,我想调试它
my_buggy_function(1)


---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
/home/user/<ipython-input-1-430423eaff77> in <module>()
      3     raise RuntimeError
      4
----> 5 my_buggy_function(1)

/home/user/<ipython-input-1-430423eaff77> in my_buggy_function(x)
      1 def my_buggy_function(x):
      2     y = x + 1
----> 3     raise RuntimeError
      4
      5 my_buggy_function(1)

 RuntimeError:

步骤2:我尝试调试该错误,但不小心引发了另一个错误(在这种情况下,我没有加载pdb)
 pdb.pm() #Oops..

 ---------------------------------------------------------------------------
 NameError                                 Traceback (most recent call last)
 /home/user/<ipython-input-2-619d77b83f20> in <module>()
 ----> 1 pdb.pm()

 NameError: name 'pdb' is not defined

 import pdb

步骤3:现在,回溯给了我最后一个错误,倒数第二个丢失了。
 pdb.traceback.print_last()
 Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/IPython/core/interactiveshell.py", line  2538, in run_code
    exec code_obj in self.user_global_ns, self.user_ns
  File "<ipython-input-1-619d77b83f20>", line 1, in <module>
   pdb.pm()
 NameError: name 'pdb' is not defined

如果我想在倒数第二次追溯中访问y,它会永远丢失吗?

注意:我在使用ipython/ipdb以防万一

最佳答案

Exception chaining仅在Python 3中可用。在2.X系列中不可用。

请参阅此答案以获取更多详细信息:https://stackoverflow.com/a/16414892/1055722

编辑:更仔细地阅读,您不是在谈论两个嵌套异常,而是一个接着一个?

在这种情况下,您可以使用sys.excepthook捕获并存储最后10个异常(例如),以便您可以查看pdb中的异常历史记录。

关于python - 如何在python中恢复较旧的回溯? (例如倒数第二个),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20518048/

10-13 04:06