如何使用pdb的post_mortem方法?

Pap*_*nho 2 python pdb

我试图了解如何使用pdb .post_mortem() 方法。

对于这个给定的文件

# expdb.py
import pdb
import trace

def hello():
  a = 6 * 9
  b = 7 ** 2
  c = a * b
  d = 4 / 0
  print(c)

tracer = trace.Trace()
Run Code Online (Sandbox Code Playgroud)

命令提示符

'''
# first Try

? python -i expdb.py
>>> pdb.post_mortem()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Anaconda3\lib\pdb.py", line 1590, in post_mortem
    raise ValueError("A valid traceback must be passed if no "
ValueError: A valid traceback must be passed if no exception is being handled
'''

'''
# Second Try

? python -i expdb.py
>>> pdb.post_mortem(traceback=tracer.run('hello()') )
 --- modulename: trace, funcname: _unsettrace
trace.py(77):         sys.settrace(None)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Program Files\Anaconda3\lib\trace.py", line 500, in run
    self.runctx(cmd, dict, dict)
  File "C:\Program Files\Anaconda3\lib\trace.py", line 508, in runctx
    exec(cmd, globals, locals)
  File "<string>", line 1, in <module>
  File "expdb.py", line 8, in hello
    d = 4 / 0
ZeroDivisionError: division by zero
>>>
Run Code Online (Sandbox Code Playgroud)

Kev*_*vin 6

post_mortem 方法需要一个回溯对象,而不是一个Trace对象。可以从块sys.exec_info()[2]内部获取回溯对象except,或者您可以pdb.post_mortem()直接(在except块中)不带参数地调用。

但无论哪种方式,您都必须先捕获异常,然后才能对其进行调试。