Heim > Fragen und Antworten > Hauptteil
Angenommen, es gibt einen Code wie diesen:
try:
a = 1
b = 0
c = a / b
except Exception as e:
print(e)
Jetzt möchte ich den Wert jeder Variablen erhalten, bevor die Ausnahme auftritt, wenn die Ausnahme auftritt, das heißt, das Ergebnis wie a=1, b=0 erhalten.
習慣沉默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
这个python应该是没法主动实现的, 因为如果有这样的方法, 在多层调用时, 出现了异常, 一层层记录相应的数据然后再返回, 那么这很可能会导致内存方面的问题; 而且在出现异常前, 虚拟机也不知道你会问题, 就好像你上面的除零异常, 是在运行 a/b => 1/0, 在PyIntobject的i_pmod函数代码实现中, 判断出除数为0, 直接触发异常, 然后一层层栈返回, 告诉用户出现异常, 在try_block中也并没有记录符号的值相关的代码, 所以顶多人为在except中, 做出更加精细, 人性化的输出了
黄舟2017-05-18 11:01:04
使用ipython 把pdb打开,可以做到报哪一行出错!
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
加入代码如下:
#!/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)
执行如下:
❯ 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)