假设我有一个非常基本的程序,肯定会引发异常。我已经添加了 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子句中,我真的不知道错误实际发生在哪里。通常,我会环顾四周,但如果我想看到堆栈跟踪,我需要恢复执行并等待程序崩溃。还有更好的方法吗?
好的,让我们从异常开始吧。在这种特殊情况下,我可以在断言上发出一条消息,但这不是重点。
> /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)ontinue 并查看退出堆栈跟踪。但现在我完全脱离了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!
答案 0 :(得分:4)
怎么样:
import traceback
traceback.print_exc()
那应该为当前正在处理的异常(触发except
控制块的异常)打印回溯。
如果在pdb
中键入命令,它将尝试将第二个命令解释为pdb
命令。通过在命令前面添加p
来防止这种情况。
供参考,traceback模块。