1. 程式人生 > >Python-異常處理與調試

Python-異常處理與調試

python 異常處理與調試

一.錯誤
1.有的錯誤是程序編寫有問題造成的,比如本來應該輸出整數結果輸出了字符串,這種錯誤我們通常稱之為 bug,bug 是必須修復的。


2.有的錯誤是用戶輸入造成的,比如讓用戶輸入 email 地址,結果得到一個空字符串,這種錯誤可以通過檢查用戶輸入來做相應的處理。


3.還有一類錯誤是完全無法在程序運行過程中預測的,比如寫入文件的時候,磁盤滿了,寫不進去了,這類錯誤也稱為異常,在程序中通常是必須處理的,否則,程序會因為各種問題終止並退出。


二.錯誤處理


1.在程序運行的過程中,如果發生了錯誤,可以事先約定返回一個錯誤代碼;


2.Python語言通常都內置了一套 try...except...finally... 的錯誤處理機制錯誤處理

try:
print ‘try...‘
r = 10 / 0
print ‘result:‘, r
except ZeroDivisionError, e:
print ‘except:‘, efinally:
print ‘finally...‘
print ‘END‘


try:裏面是可能產生異常的代碼;
except: 捕獲異常
finally:無論是否有異常,都執行該代碼;

- 用 try 來運行可能會出錯的代碼;
- 如果執行正確,則except 語句塊不會執行;
- 如果執行錯誤,直接跳轉至錯誤處理代碼,即except語句塊;
- 如果有 finally 語句塊,不管try語句塊內容是否正確,都會執行 finally

技術分享


3.語句塊錯誤處理

錯誤有很多種類,如果發生了不同類型的錯誤,應該由不同的 except語句塊處理。因此可以有多個 except 來捕獲不同類型的錯誤。
eroDivisionError:‘, e
print ‘ValueError:‘, e
except ZeroDivisionError, e:

print ‘ZeroDivisionError:‘, e


錯誤處理
- Python 的錯誤其實也是 class,所有的錯誤類型都繼承自BaseException;
- 在使用except 捕獲該類型的錯誤,還把其子類也“一網打盡”;
技術分享



三.讀懂復雜的錯誤
1. 解讀錯誤信息是定位錯誤的關鍵。我們從上往下可以看到整個錯誤的調用函數鏈。
2. 不捕獲錯誤,Python 解釋器會打印出錯誤信息,但程序也被結束;
3. 捕獲錯誤,就可以把錯誤信息打印出來,然後分析錯誤原因,同時,讓程序繼續執行下去。
4. Python 內置的 logging 模塊可以記錄錯誤信息。logging.exception(e)拋出錯誤
5. 錯誤是 class,捕獲一個錯誤就是捕獲到該 class 的一個實例;
6. Python 的內置函數會拋出很多類型的錯誤,我們自己編寫的函數也可以拋出錯誤。
7. 可以定義一個錯誤的 class,選擇好繼承關系,然後,用raise 語句拋出一個錯誤的實例;
8. 盡量使用 Python 內置的錯誤類型拋出錯誤

技術分享


技術分享


技術分享




四.調試

1.print
第一種方法簡單直接粗暴有效,就是用 print 把可能有問題的變量打印出來看看。用 print 最大的壞處是將來還得刪掉它,運行結果也會包含很多垃圾信息。

註:print,把你想知道的變量打印出來;缺點是,你將來需要手動刪除print

技術分享


技術分享


2.斷言
- 凡是用 print 來輔助查看的地方,都可以用斷言(assert)來替代:;
- 如果斷言失敗, assert 語句本身就會拋出 AssertionError
- Python 解釋器執行時可以用 -O 參數來關閉 assert,把所有的 assert 語句當成 pass。

註:斷言, assert (你的預期),“如果沒有達到預期顯示的內容”

技術分享




3.logging
- logging 不會拋出錯誤,而且可以輸出到文件;
- logging.info() 就可以輸出一段文本到日誌文件中。
- logging.basicConfig(level=logging.INFO)指定記錄信息的級別,有debug , info , warning , error等幾個級別,他們級別依次增大debug < info < warn < error < critical


默認情況下不顯示info級別的錯誤日誌,只顯示warn及warn以上的錯誤日誌

技術分享


調整默認級別為info後,可以顯示info級別的日誌

技術分享

技術分享



4. pdb,pycharm中切換到Terminal下執行
- pdb
pdb讓程序以單步方式運行,隨時查看運行狀態。n 可以單步執行代碼,p 變量名 來查看變量,q 結束調試,退出程序。

技術分享


- pdb.set_trace
在可能出錯的地方放一個 pdb.set_trace() ,就可以設置一個斷點。程序會自動在 pdb.set_trace() 暫停並進入 pdb 調試環境, p 查看變量, c 繼續運行。

技術分享


Python-異常處理與調試