python - 如何获取异常时栈中的数值
问题描述
假设有这样一段代码:
try: a = 1 b = 0 c = a / bexcept Exception as e: print(e)
现在想在异常发生时获取到异常发生前每个变量的数值,即获取到a=1,b=0这样的结果。
问题解答
回答1:inspect.currentframe
>>> import inspect>>> a=1;b=0;a/bTraceback (most recent call last): File '<pyshell#10>', line 1, in <module> a=1;b=0;a/bZeropisionError: pision by zero>>> f=inspect.currentframe()>>> f.f_globals[’a’]1>>> f.f_globals[’b’]0>>> 回答2:
这个python应该是没法主动实现的, 因为如果有这样的方法, 在多层调用时, 出现了异常, 一层层记录相应的数据然后再返回, 那么这很可能会导致内存方面的问题; 而且在出现异常前, 虚拟机也不知道你会问题, 就好像你上面的除零异常, 是在运行 a/b => 1/0, 在PyIntobject的i_pmod函数代码实现中, 判断出除数为0, 直接触发异常, 然后一层层栈返回, 告诉用户出现异常, 在try_block中也并没有记录符号的值相关的代码, 所以顶多人为在except中, 做出更加精细, 人性化的输出了
回答3:使用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 / bipdb> 回答4:
pdb
加入代码如下:
#!/usr/bin/env python# encoding: utf-8try: a = 1 b = 0 c = a / bexcept 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 a1(Pdb) p b0(Pdb)
相关文章:
1. 为什么span的color非要内联样式才起作用?2. javascript - swiper.js嵌套了swiper 初始设置不能向下一个滑动 结束后重新初始3. python - Django ManyToManyField 字段数据在 admin后台 显示不正确,这是怎么回事?4. docker - 如何修改运行中容器的配置5. python - 如何修改twisted自带的日志输出格式?6. 求救一下,用新版的phpstudy,数据库过段时间会消失是什么情况?7. 请问一下各位老鸟 我一直在学习独孤九贱 现在是在tp5 今天发现 这个系列视频没有实战8. 在cmd下进入mysql数据库,可以输入中文,但是查看表信息,不显示中文,是怎么回事,怎新手,请老师9. github - 求助大神啊,win10 git clone error,折腾了几天都不行,以前原本好好的,突然就这样了10. 高并发写入和更新mysql

网公网安备