python - Comment obtenir une valeur dans la pile lorsqu'une exception se produit
習慣沉默
習慣沉默 2017-05-18 10:59:04
0
4
717

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.

習慣沉默
習慣沉默

répondre à tous(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
>>> 
Ty80

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

.
黄舟

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

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)
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal