suchen

Heim  >  Fragen und Antworten  >  Hauptteil

python – So erhalten Sie den Wert im Stapel, wenn eine Ausnahme auftritt

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.

習慣沉默習慣沉默2749 Tage vor719

Antworte allen(4)Ich werde antworten

  • 習慣沉默

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

    Antwort
    0
  • PHP中文网

    PHP中文网2017-05-18 11:01:04

    这个python应该是没法主动实现的, 因为如果有这样的方法, 在多层调用时, 出现了异常, 一层层记录相应的数据然后再返回, 那么这很可能会导致内存方面的问题; 而且在出现异常前, 虚拟机也不知道你会问题, 就好像你上面的除零异常, 是在运行 a/b => 1/0, 在PyIntobjecti_pmod函数代码实现中, 判断出除数为0, 直接触发异常, 然后一层层栈返回, 告诉用户出现异常, 在try_block中也并没有记录符号的值相关的代码, 所以顶多人为在except中, 做出更加精细, 人性化的输出了

    Antwort
    0
  • 黄舟

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

    Antwort
    0
  • 为情所困

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

    Antwort
    0
  • StornierenAntwort