python - 如何獲取異常時(shí)棧中的數(shù)值
問(wèn)題描述
假設(shè)有這樣一段代碼:
try: a = 1 b = 0 c = a / bexcept Exception as e: print(e)
現(xiàn)在想在異常發(fā)生時(shí)獲取到異常發(fā)生前每個(gè)變量的數(shù)值,即獲取到a=1,b=0這樣的結(jié)果。
問(wèn)題解答
回答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:
這個(gè)python應(yīng)該是沒(méi)法主動(dòng)實(shí)現(xiàn)的, 因?yàn)槿绻羞@樣的方法, 在多層調(diào)用時(shí), 出現(xiàn)了異常, 一層層記錄相應(yīng)的數(shù)據(jù)然后再返回, 那么這很可能會(huì)導(dǎo)致內(nèi)存方面的問(wèn)題; 而且在出現(xiàn)異常前, 虛擬機(jī)也不知道你會(huì)問(wèn)題, 就好像你上面的除零異常, 是在運(yùn)行 a/b => 1/0, 在PyIntobject的i_pmod函數(shù)代碼實(shí)現(xiàn)中, 判斷出除數(shù)為0, 直接觸發(fā)異常, 然后一層層棧返回, 告訴用戶出現(xiàn)異常, 在try_block中也并沒(méi)有記錄符號(hào)的值相關(guān)的代碼, 所以頂多人為在except中, 做出更加精細(xì), 人性化的輸出了
回答3:使用ipython 把pdb打開,可以做到報(bào)哪一行出錯(cuò)!
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() # <-- 加入斷點(diǎn) print(e)
執(zhí)行如下:
? 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)
相關(guān)文章:
1. javascript - sublime快鍵鍵問(wèn)題2. javascript - immutable配合react提升性能?3. css - 寫頁(yè)面遇到個(gè)布局問(wèn)題,求大佬們幫解答,在線等,急!~4. 實(shí)現(xiàn)bing搜索工具urlAPI提交5. vue.js - Vue 如何像Angular.js watch 一樣監(jiān)聽數(shù)據(jù)變化6. javascript - nodejs關(guān)于進(jìn)程間發(fā)送句柄的一點(diǎn)疑問(wèn)7. 配置Apache時(shí),添加對(duì)PHP的支持時(shí)語(yǔ)法錯(cuò)誤8. phpstudy8.1支持win11系統(tǒng)嗎?9. javascript - vue-router 地址改變數(shù)據(jù)未改變10. javascript - 移動(dòng)端上不能實(shí)現(xiàn)拖拽布局嗎?

網(wǎng)公網(wǎng)安備