Maison  >  Questions et réponses  >  le corps du texte

python - Comment obtenir une valeur dans la pile lorsqu'une exception se produit

Supposons qu'il existe un morceau de code comme celui-ci :

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

Maintenant, je veux obtenir la valeur de chaque variable avant que l'exception ne se produise lorsque l'exception se produit, c'est-à-dire obtenir le résultat comme a=1, b=0.

習慣沉默習慣沉默2711 Il y a quelques jours678

répondre à tous(4)je répondrai

  • 習慣沉默

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

    répondre
    0
  • PHP中文网

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

    Ce python ne devrait pas être capable de l'implémenter activement, car s'il existe une telle méthode, une exception se produit lors des appels multicouches et les données correspondantes sont enregistrées couche par couche puis renvoyées, cela est susceptible de provoquer des problèmes de mémoire ; Et avant qu'une exception ne se produise, la machine virtuelle ne sait pas que vous avez un problème. C'est comme si votre exception de division par zéro ci-dessus exécutait a/b => 1/0, implémentée dans la fonction i_pmod. code de PyIntobject , on juge que le diviseur est 0, une exception est déclenchée directement, puis la pile renvoie couche par couche pour indiquer à l'utilisateur qu'une exception s'est produite. Il n'y a pas de code lié à la valeur du symbole. enregistré dans le try_block, donc la plupart des gens créent un code plus détaillé dans except , une sortie humanisée

    .

    répondre
    0
  • 黄舟

    黄舟2017-05-18 11:01:04

    Utilisez ipython pour ouvrir pdb et vous pourrez signaler quelle ligne contient une erreur !

    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> 

    répondre
    0
  • 为情所困

    为情所困2017-05-18 11:01:04

    pdb

    Le code d'adhésion est le suivant :

    #!/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)

    L'exécution est la suivante :

    ❯ 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)

    répondre
    0
  • Annulerrépondre