84669 人学习
152542 人学习
20005 人学习
5487 人学习
7821 人学习
359900 人学习
3350 人学习
180660 人学习
48569 人学习
18603 人学习
40936 人学习
1549 人学习
1183 人学习
32909 人学习
假设有这样一段代码:
try: a = 1 b = 0 c = a / b except Exception as e: print(e)
现在想在异常发生时获取到异常发生前每个变量的数值,即获取到a=1,b=0这样的结果。
inspect.currentframe
这个python应该是没法主动实现的, 因为如果有这样的方法, 在多层调用时, 出现了异常, 一层层记录相应的数据然后再返回, 那么这很可能会导致内存方面的问题; 而且在出现异常前, 虚拟机也不知道你会问题, 就好像你上面的除零异常, 是在运行 a/b => 1/0, 在PyIntobject的i_pmod函数代码实现中, 判断出除数为0, 直接触发异常, 然后一层层栈返回, 告诉用户出现异常, 在try_block中也并没有记录符号的值相关的代码, 所以顶多人为在except中, 做出更加精细, 人性化的输出了
使用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>
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)
雷雷inspect.currentframe
这个python应该是没法主动实现的, 因为如果有这样的方法, 在多层调用时, 出现了异常, 一层层记录相应的数据然后再返回, 那么这很可能会导致内存方面的问题; 而且在出现异常前, 虚拟机也不知道你会问题, 就好像你上面的除零异常, 是在运行 a/b => 1/0, 在PyIntobject的i_pmod函数代码实现中, 判断出除数为0, 直接触发异常, 然后一层层栈返回, 告诉用户出现异常, 在try_block中也并没有记录符号的值相关的代码, 所以顶多人为在except中, 做出更加精细, 人性化的输出了
使用ipython 把pdb打开,可以做到报哪一行出错!
pdb
加入代码如下:
执行如下: