如何在Python中恢复旧的回溯信息?例如,倒数第二个。

5

我相信你已经遇到过这种情况,而且我怀疑没有什么办法可以解决。 假设你运行了一些引发异常的Python代码,然后想要查看其中的错误,但在此过程中意外引发了另一个异常。如果现在尝试进行死后调试,则会看到后一个异常的回溯信息。我的问题是,前一个异常是否永远消失了?

示例:

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

步骤一:我遇到错误并想要调试它。
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 

步骤三:现在追溯错误信息,最后一个错误已知,而倒数第二个错误则不明确。
 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

如果我想在倒数第二个 traceback 中访问 y,它是否永远丢失了?
注:我正在使用 ipython/ipdb,如果有关系的话。

我相信你可以通过 sys.last_traceback 访问到最后的回溯信息--试一下并让我知道结果。由于我自己不使用IPython,所以无法完全重现你的情况。 - James Mills
1
当出现新的异常时,last_traceback 不会指向该异常吗? - thefourtheye
还有sys.exc_tracback正在处理的当前回溯)--因此,sys文档让我相信这个可能有效。 - James Mills
这正是问题所在:有很多方法可以访问最后一个错误的回溯,但我不知道任何访问上一个(倒数第二个)错误的方法。 - ggll
2
你可以默认开启ipython的“自动pdb调用”。这样,一旦出现未捕获的异常,你就已经准确地到达了想要到达的位置。你再也不会“丢失”它了。 - shx2
1个回答

0

异常链仅适用于Python 3,不适用于2.X系列。

有关更多详细信息,请参见此答案:https://dev59.com/42Qn5IYBdhLWcg3w_LPx#16414892

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

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


是的,我的问题涉及到两个不相关的异常,一个接一个地发生。 - ggll
谢谢您的建议,在查看了sys.excepthook之后,我想我可以使用它来实现某种形式的"异常堆栈",但我还希望已经有这样的东西可用。 - ggll
1
抱歉,没有内置的异常历史记录。如果您需要,您将不得不自己编写。 - David K. Hess

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接