如果發生錯誤,可以事先約定返回乙個錯誤**,這樣就可以知道是否有錯以及原因。eg開啟檔案的函式open(),成功時返回檔案描述符(就是乙個整數),出錯時返回-1.
用錯誤碼來表示是否出錯十分不便。
錯誤處理機制:try—except—finally
try:
******
except ***x as e:
******
else:
finally
所有的錯誤型別都繼承自baseexception,所以在使用except時需要注意的是,它不但捕獲該型別的錯誤,會把子型別也一網打盡
python所有的錯誤都是從baseexception類派生的,常見的錯誤型別和繼承關係
如果錯誤沒有**獲,它會被一直往上拋,最後被python直譯器捕獲,列印乙個錯誤資訊,然後程式退出。
出錯的時候,一定要分析錯誤的呼叫棧資訊,才能定位錯誤的位置
如果不捕獲錯誤,讓python直譯器列印出錯誤堆疊,但是程式也被結束了。我們捕獲錯誤就可以把錯誤堆疊列印出來,然後分析錯誤原因,同時讓程式繼續執行下去
py內建的logging模組可以容易地記錄錯誤資訊。配置後,logging還可以把錯誤記錄到日誌檔案裡,方便事後排查。
因為錯誤是class,捕獲乙個錯誤就是捕獲到該class的乙個例項。因此,錯誤並不是憑空產生的,而是有意建立並丟擲的。
如果要丟擲錯誤,首先根據需要,可以定義乙個錯誤的class,選擇好繼承關係然後用raise語句丟擲乙個錯誤例項
如果可以選擇python已有的內建的錯誤型別(比如valueerror,typeerror),盡量使用python內建的錯誤型別。
raise語句如果不帶引數,就會把當前錯誤原樣丟擲。此外,在except中raise乙個error,還可以把一種型別的錯誤轉化成另一種型別
第一種就是在下天天用的。。。用print列印出來變數
用assert代替print
如果斷言後面的語句失敗 丟擲異常語句
最後啟用py直譯器時可以用-o引數來關閉assert:
$ python -o err.py
關閉後所有的assert語句當成pass來看
用logging代替print,比起assert,logging不會丟擲錯誤,而且可以輸出到檔案
logging的有點:允許指定記錄資訊的級別,有debug,info,waring,erro幾個級別。
import logging
logging.basicconfig(level=logging.info)
第四種啟動py的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態。
但是太麻煩了。
補充一種除錯方法
也是用pdb,但不需要單步執行,我們只需要import pdb,然後在可能跟出錯的地方放乙個pdb.set_trace(),就可以設定乙個斷點。
執行**,程式會自動在這一行暫停並進入pdb除錯模式,可以用命令 p 檢視變數,或者用命令c繼續執行
總結logging是終極**的呀。
tdd 測試驅動開發
單元測試是用來對乙個模組、乙個函式或者乙個類來進行正確性檢驗的測試工作。
ifname==『main』:
unittest.main()
第二種方法 命令列通過引數 -m unittest 直接執行 推薦-可以一次
這兩個方法會分別在每呼叫乙個測試方法的前後分別被執行。
如果測試需要啟動乙個資料庫,可以在setup()方法中連線資料庫,在teardown()方法中關閉資料庫,這樣不必在每個測試方法中重複相同的**。
錯誤 除錯和測試
在程式執行過程中,總會遇到各種各樣的錯誤。有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字串,這種錯誤我們通常稱之為bug,bug是必須修復的。有的錯誤是使用者輸入造成的,比如讓使用者輸入email位址,結果得到乙個空字串,這種錯誤可以通過檢查使用者輸入來做相應的處理。還有一類錯誤是...
錯誤 除錯和測試
try except finally try print 測試開始 m 10 0 製造乙個錯誤 print 未出現錯誤 若有錯誤,跳過此局 出現錯誤跳到except語句 except zerodivisionerror as e except捕獲到zerodivisionerror然後執行 prin...
python錯誤 除錯和測試
錯誤 除錯和測試 當我們認為某些 可能會出錯時,就可以用try來執行這段 如果執行出錯,則後續 不會繼續執行,而是直接跳轉至錯誤處理 即except語句塊,執行完except後,如果有finally語句塊,則執行finally語句塊,至此,執行完畢。出錯的時候,一定要分析錯誤的呼叫棧資訊,才能定位錯...