python - 如何獲取異常時棧中的數值
問題描述
假設有這樣一段代碼:
try: a = 1 b = 0 c = a / bexcept Exception as e: print(e)
現在想在異常發生時獲取到異常發生前每個變量的數值,即獲取到a=1,b=0這樣的結果。
問題解答
回答1:inspect.currentframe
>>> import inspect>>> a=1;b=0;a/bTraceback (most recent call last): File '<pyshell#10>', line 1, in <module> a=1;b=0;a/bZeropisionError: pision by zero>>> f=inspect.currentframe()>>> f.f_globals[’a’]1>>> f.f_globals[’b’]0>>> 回答2:
這個python應該是沒法主動實現的, 因為如果有這樣的方法, 在多層調用時, 出現了異常, 一層層記錄相應的數據然后再返回, 那么這很可能會導致內存方面的問題; 而且在出現異常前, 虛擬機也不知道你會問題, 就好像你上面的除零異常, 是在運行 a/b => 1/0, 在PyIntobject的i_pmod函數代碼實現中, 判斷出除數為0, 直接觸發異常, 然后一層層棧返回, 告訴用戶出現異常, 在try_block中也并沒有記錄符號的值相關的代碼, 所以頂多人為在except中, 做出更加精細, 人性化的輸出了
回答3:使用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 / bipdb> 回答4:
pdb
加入代碼如下:
#!/usr/bin/env python# encoding: utf-8try: a = 1 b = 0 c = a / bexcept 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 a1(Pdb) p b0(Pdb)
相關文章:
1. angular.js - 如何從AngularJS遷移到Vue?2. css - AngularJS如何判斷不同情況設置不同背景色??3. css - 求推薦幾款好用的移動端頁面布局調試工具呢?4. javascript - jquery ajax 用jsonp的方式跨域訪問,為什么報錯5. CSS3 中 transition-duration 對 display: none/block 屬性無效?6. css3 - 根據效果,分析一下該動態是如何實現的?7. javascript - 如何利用vue組件 動態生成router-link8. javascript - jQuery中live事件在移動微信端下沒有效果;代碼如下9. javascript - 微信小程序中設置頭像 里面的圖片路徑是怎么解決的 我把接口生成的路徑存到數據庫中 2次訪問時就顯示不出來了10. javascript - 微信小程序的分享問題
