python - 如何取得異常時堆疊中的數值
習慣沉默
習慣沉默 2017-05-18 10:59:04
0
4
663

假設有這樣一段程式碼:

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

現在想在異常發生時取得到異常發生前每個變數的數值,即取得到a=1,b=0這樣的結果。

習慣沉默
習慣沉默

全部回覆(4)
習慣沉默

inspect.currentframe

雷雷
Ty80

這個python應該是沒法主動實現的, 因為如果有這樣的方法, 在多層調用時, 出現了異常, 一層層記錄相應的數據然後再返回, 那麼這很可能會導致內存方面的問題;而且在出現異常前, 虛擬機也不知道你會問題, 就好像你上面的除零異常, 是在運行a/b => 1/0, 在PyIntobjecti_pmod函數代碼實現中, 判斷出除數為0, 直接觸發異常, 然後一層層棧返回, 告訴用戶出現異常, 在try_block中也並沒有記錄符號的值相關的代碼, 所以頂多人為在except中, 做出更加精細,人性化的輸出了

黄舟

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

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)
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!