search

Home  >  Q&A  >  body text

python - How to get the value in the stack when exception occurs

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.

習慣沉默習慣沉默2745 days ago713

reply all(4)I'll reply

  • 習慣沉默

    習慣沉默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
    >>> 

    reply
    0
  • PHP中文网

    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

    reply
    0
  • 黄舟

    黄舟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> 

    reply
    0
  • 为情所困

    为情所困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)

    reply
    0
  • Cancelreply