从pdb中快速而肮脏地知道哪一行引发了异常并查看堆栈跟踪

  • 本文关键字:一行 异常 堆栈 跟踪 pdb python pdb
  • 更新时间 :
  • 英文 :


假设我有一个非常基本的程序,它肯定会抛出异常。我在其中添加了一个pdb.set_trace(),我希望在出现错误时能够四处查看。

import pdb
from random import randint
def two_possible_errors(input):
    try:
        assert input % 2, "error!"
        assert not input % 2, "error!"
    except Exception, e:
        pdb.set_trace()
        raise
two_possible_errors(randint(0,9))

我的问题是,当我捕捉到异常时,我已经在except子句中了,我真的不知道错误实际发生在哪里。通常,我会四处看看,但如果我想查看堆栈跟踪,我需要继续执行并等待程序崩溃。有更好的方法吗?

好的,让我们从例外开始。在这种特殊的情况下,我可以在assert上留言,但这与重点无关。

> /Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(16)two_possible_errors()
-> raise
(Pdb) e
AssertionError('error!',)

在这一点上,我不知道这两行中哪一行错了。

让我们在中尝试。它返回当前位置,而不是异常发生的位置。

(Pdb) where
  /Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(20)<module>()
-> test()
  /Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(18)test()
-> two_possible_errors(randint(0,9))
> /Users/jluc/kds2/wk/explore/explore_pdb_exceptions.py(16)two_possible_errors()
-> raise

让我们打印第16行,只是为了确定:

(Pdb) l 16
 11             try:
 12                 assert input % 2, "error!"
 13                 assert not input % 2, "error!"
 14             except Exception, e:
 15                 pdb.set_trace()
 16  ->             raise
 17
 18         two_possible_errors(randint(0,9))
 19
 20     test()

为了真正知道我在哪里,我可以让pdb(c)继续并检查退出堆栈。但现在我完全脱离了pdb。有没有一种简单的方法可以从异常本身获取信息?继续之前?

(Pdb) c
Traceback (most recent call last):
  File "explore_pdb_exceptions.py", line 20, in <module>
    test()
  File "explore_pdb_exceptions.py", line 18, in test
    two_possible_errors(randint(0,9))
  File "explore_pdb_exceptions.py", line 13, in two_possible_errors
    assert not input % 2, "error!"
AssertionError: error!

怎么样:

import traceback
traceback.print_exc()

这应该打印当前正在处理的异常(触发except控制块的异常)的回溯。

如果在pdb中键入命令,它将尝试将第二个命令解释为pdb命令。通过在命令前面添加p来防止这种情况发生。

回溯模块供参考。

最新更新