錯誤調試和測試
在代碼編寫和運行過程中總會遇到各種錯誤,這是不可避免的;
- 錯誤處理
1、錯誤基類BaseException類似java的try catch finally和Exception類;
try:
...
Except _ as _:
...
finally:
2、可以多層跨越處理,不用每一層都去捕獲錯誤,只需要在適當的位置捕獲一次就行了,因爲錯誤沒有捕獲時,他就會一直往上拋,最後被python解釋器捕獲並打印錯誤信息;
- 調用堆棧
利用打印的信息,查找錯誤出現在那裏
- 記錄錯誤
Logging模塊可以記錄錯誤信息並打logging.exception(e)拋出錯誤(raise)
可根據自己的需要創建一個自定義錯誤,raise如果不帶參數,就會把錯誤原樣拋出,在except中raise一個Error,還可以把一種類型的錯誤轉化成另外一種,但不建議亂來;
核心原則:我們應該清楚在什麼位置出現什麼錯誤;
- 調試
1、斷言(assert):可以用參數-0來控制assert,當參數爲-0時assert相當於pass:
assert n != 0, 'n is zero!'#n!=0時是Ture
$ python3 -O err.py#參數控制
2、logging不會拋出錯誤,還可以輸出到文件:logging.info(),且分爲如下四個級別:Debug、Info、Warning、Error;
logging.basicConfig(level=logging.INFO)
3、調試器pdb:python -m pdb err.py啓動調試器;
輸入1查看代碼;
輸入n單步執行代碼;
輸入p查看變量;
輸入q退出
4、pdb.set_trace()設置斷點,再要需要地方放置一個斷點即可;
- 單元測試
1、用來對一個模塊、一個函數或者一個類進行正確性的檢測;
2、引入模塊import unittest;
3、編寫單元測試時,我們需要編寫一個測試類,從unittest.TestCase繼承;
4、test開偷纔會被認爲是測試方法;
5、最常用的斷言方法:assertEqual();
6、運行單元測試;
if __name__ == '__main__':
unittest.main()
7、setUp和tearDown
這兩個方法會分別在每調用一個測試方法的前後分別被執行
- 文檔測試
Python內置的“文檔測試”(doctest)模塊可以直接提取註釋中的代碼並執行測試,doctest嚴格按照Python交互式命令行的輸入和輸出來判斷測試結果是否正確。只有測試異常的時候,可以用“…”表示中間一大段煩人的輸出;