python - Bagaimana untuk mendapatkan nilai dalam timbunan apabila pengecualian berlaku
習慣沉默
習慣沉默 2017-05-18 10:59:04
0
4
710

Andaikan terdapat sekeping kod seperti ini:

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

Sekarang saya ingin mendapatkan nilai setiap pembolehubah sebelum pengecualian berlaku apabila pengecualian berlaku, iaitu, dapatkan keputusan seperti a=1, b=0.

習慣沉默
習慣沉默

membalas semua(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

Ular sawa ini tidak sepatutnya dapat melaksanakan secara aktif, kerana jika terdapat kaedah sedemikian, pengecualian berlaku semasa panggilan berbilang lapisan, dan data yang sepadan direkodkan lapisan demi lapisan dan kemudian dikembalikan, maka ini mungkin menyebabkan masalah masalah ingatan; dan sebelum pengecualian berlaku, mesin maya tidak tahu bahawa anda mempunyai masalah, sama seperti pengecualian bahagian-dengan-sifar anda di atas sedang berjalan a/b => #, dalam# Dalam pelaksanaan i_pmod kod fungsi 🎜🎜#PyIntobject, ia dinilai bahawa pembahagi ialah 0, pengecualian dicetuskan terus, dan kemudian timbunan adalah mengembalikan lapisan demi lapisan untuk memaklumkan pengguna bahawa pengecualian telah berlaku, yang turut disertakan dalam try_block Tiada kod yang berkaitan dengan nilai simbol yang direkodkan, jadi kebanyakan orang boleh membuat output yang lebih tepat dan berperikemanusiaan dalam kecuali

黄舟

Gunakan ipython untuk membuka pdb, dan anda boleh melaporkan baris mana yang mempunyai ralat!

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

Tambah kod berikut:

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

Laksanakan seperti berikut:

❯ 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)
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan