假設有這樣一段程式碼:
try: a = 1 b = 0 c = a / b except Exception as e: print(e)
現在想在異常發生時取得到異常發生前每個變數的數值,即取得到a=1,b=0這樣的結果。
inspect.currentframe
這個python應該是沒法主動實現的, 因為如果有這樣的方法, 在多層調用時, 出現了異常, 一層層記錄相應的數據然後再返回, 那麼這很可能會導致內存方面的問題;而且在出現異常前, 虛擬機也不知道你會問題, 就好像你上面的除零異常, 是在運行a/b => 1/0, 在PyIntobject的i_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)
雷雷inspect.currentframe
這個python應該是沒法主動實現的, 因為如果有這樣的方法, 在多層調用時, 出現了異常, 一層層記錄相應的數據然後再返回, 那麼這很可能會導致內存方面的問題;而且在出現異常前, 虛擬機也不知道你會問題, 就好像你上面的除零異常, 是在運行a/b => 1/0, 在PyIntobject的i_pmod函數代碼實現中, 判斷出除數為0, 直接觸發異常, 然後一層層棧返回, 告訴用戶出現異常, 在try_block中也並沒有記錄符號的值相關的代碼, 所以頂多人為在except中, 做出更加精細,人性化的輸出了
使用ipython 把pdb打開,可以做到報哪一行出錯!
pdb
加入程式碼如下:
執行如下: