Suppose there is such a piece of code:
try:
a = 1
b = 0
c = a / b
except Exception as e:
print(e)
Now I want to get the value of each variable before the exception occurs when the exception occurs, that is, get the result like a=1, b=0.
習慣沉默2017-05-18 11:01:04
inspect.currentframe
>>> import inspect
>>> a=1;b=0;a/b
Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
a=1;b=0;a/b
ZeropisionError: pision by zero
>>> f=inspect.currentframe()
>>> f.f_globals['a']
1
>>> f.f_globals['b']
0
>>>
PHP中文网2017-05-18 11:01:04
This python should not be able to actively implement it, because if there is such a method, an exception occurs during multi-layer calls, and the corresponding data is recorded layer by layer and then returned, then this is likely to cause memory problems; And before an exception occurs, the virtual machine doesn't know that you have a problem. It's like your division-by-zero exception above is running a/b => 1/0, implemented in the i_pmod function code of PyIntobject , it is judged that the divisor is 0, an exception is triggered directly, and then the stack returns layer by layer to tell the user that an exception has occurred. There is no code related to the value of the symbol recorded in the try_block, so at most people make more detailed code in except. , humanized output
黄舟2017-05-18 11:01:04
Use ipython to open pdb, and you can report which line has an error!
ZeropisionError: integer pision or modulo by zero
> <ipython-input-4-a5ac4c0f15ad>(4)<module>()
1
2 a = 1
3 b = 0
----> 4 c = a / b
ipdb>
为情所困2017-05-18 11:01:04
pdb
Add the following code:
#!/usr/bin/env python
# encoding: utf-8
try:
a = 1
b = 0
c = a / b
except Exception as e:
import pdb; pdb.set_trace() # <-- 加入断点
print(e)
Execute as follows:
❯ python sf.py
> /Users/caimaoy/tmp/sf.py(10)<module>()
-> print(e)
(Pdb) ll
1 #!/usr/bin/env python
2 # encoding: utf-8
3
4 try:
5 a = 1
6 b = 0
7 c = a / b
8 except Exception as e:
9 import pdb; pdb.set_trace()
10 -> print(e)
(Pdb) p a
1
(Pdb) p b
0
(Pdb)