我正在使用pdb调试一个名为a.py
的程序
def f(x) :
x / x
def g(x) :
try :
f(x)
except Exception as e :
assert 0
g(0)
当我使用python3 -m pdb a.py
运行程序时,程序在assert 0
行停止,我得到以下错误信息:
Traceback (most recent call last):
File "/tmp/a.py", line 6, in g
f(x)
File "/tmp/a.py", line 2, in f
x / x
ZeroDivisionError: division by zero
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/lib64/python3.6/pdb.py", line 1667, in main
pdb._runscript(mainpyfile)
File "/usr/lib64/python3.6/pdb.py", line 1548, in _runscript
self.run(statement)
File "/usr/lib64/python3.6/bdb.py", line 434, in run
exec(cmd, globals, locals)
File "<string>", line 1, in <module>
File "/tmp/a.py", line 11, in <module>
g(0)
File "/tmp/a.py", line 9, in g
assert 0
AssertionError
并且堆栈是(使用bt
命令显示):
(Pdb) bt
/usr/lib64/python3.6/pdb.py(1667)main()
-> pdb._runscript(mainpyfile)
/usr/lib64/python3.6/pdb.py(1548)_runscript()
-> self.run(statement)
/usr/lib64/python3.6/bdb.py(434)run()
-> exec(cmd, globals, locals)
<string>(1)<module>()->None
/tmp/a.py(11)<module>()->None
-> g(0)
> /tmp/a.py(9)g()
-> assert 0
(Pdb)
问题是,我不能简单地使用x / x
和up
去函数f调试down
,因为我的堆栈结束于g函数。
我应该如何在异常中调试此类异常?异常中的异常例外情况怎么样?
在我看来,你有几个选择。您可以将try-except
移动到f(x)
,在g()
try-except
中打印描述性错误并放入pdb,或者在记录友好错误消息后重新引发异常。我不喜欢依赖未捕获的异常来调试(选项3),所以这里是选项1和2的样子:
'''Option 1'''
def f(x) :
try:
x / x
except Exception as e:
print('An error occurred, entering pdb shell')
import pdb; pdb.set_trace()
def g(x) :
f(x)
g(0)
输出:
$ python throw.py
An error occurred, entering pdb shell
--Return--
> /home/wholevinski/so_test/throw.py(6)f()->None
-> import pdb; pdb.set_trace()
(Pdb) x
0
要么:
'''Option 2'''
def f(x):
x / x
def g(x):
try:
f(x)
except Exception as e:
print('f({}) raised with error "{}". Entering pdb shell.'.format(x, str(e)))
import pdb; pdb.set_trace()
g(0)
输出:
$ python throw.py
f(0) raised with error division by zero. Entering pdb shell.
--Return--
> /home/wholevinski/so_test/throw.py(9)g()->None
-> import pdb; pdb.set_trace()
(Pdb) x
实际上重新引发异常( wholevinski的answer中的选项3)解决了我的问题,因为它不需要我修改函数f。这是代码:
'''Option 3'''
def f(x) :
x -= 1
x / x
def g(x) :
try :
for i in range(x, 0, -1) :
print(f(i))
except Exception as e :
raise e
g(10)
堆栈的Pdb输出:
(Pdb) bt
/usr/lib64/python3.6/pdb.py(1667)main()
-> pdb._runscript(mainpyfile)
/usr/lib64/python3.6/pdb.py(1548)_runscript()
-> self.run(statement)
/usr/lib64/python3.6/bdb.py(434)run()
-> exec(cmd, globals, locals)
<string>(1)<module>()->None
/tmp/a.py(13)<module>()->None
-> g(10)
/tmp/a.py(11)g()
-> raise e
/tmp/a.py(9)g()
-> print(f(i))
> /tmp/a.py(4)f()
-> x / x
(Pdb)