python - 如何获取异常时栈中的数值
習慣沉默
習慣沉默 2017-05-18 10:59:04
[Python讨论组]

假设有这样一段代码:

try:
    a = 1
    b = 0
    c = a / b
except Exception as e:
    print(e)

现在想在异常发生时获取到异常发生前每个变量的数值,即获取到a=1,b=0这样的结果。

習慣沉默
習慣沉默

全部回复(4)
習慣沉默

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中文网

这个python应该是没法主动实现的, 因为如果有这样的方法, 在多层调用时, 出现了异常, 一层层记录相应的数据然后再返回, 那么这很可能会导致内存方面的问题; 而且在出现异常前, 虚拟机也不知道你会问题, 就好像你上面的除零异常, 是在运行 a/b => 1/0, 在PyIntobjecti_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)
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号