Python學習(8)——錯誤、除錯和測試
1、錯誤處理
(1)常見的錯誤型別和繼承關係看這裡:
https://docs.python.org/3/library/exceptions.html#exception-hierarchy
(2)如果錯誤沒有被捕獲,它就會一直往上拋,最後被Python直譯器捕獲,列印一個錯誤資訊,然後程式退出
出錯的時候,一定要分析錯誤的呼叫棧資訊,才能定位錯誤的位置
(3)Python內建的logging
模組可以非常容易地記錄錯誤資訊。
通過配置,logging
還可以把錯誤記錄到日誌檔案裡,方便事後排查
(4)如果要丟擲錯誤,可以根據需要定義一個錯誤的class,選擇好繼承關係,然後用raise
語句丟擲一個錯誤的例項
(5)raise
語句如果不帶引數,就會把當前錯誤原樣丟擲
2、除錯
(1)程式中如果到處充斥著assert
,和print()
相比也好不到哪去。不過,啟動Python直譯器時可以用-O
引數來關閉assert
(2)logging
的好處是,它允許你指定記錄資訊的級別,有debug
,info
,warning
,error
等幾個級別。當我們指定level=INFO
時,logging.debug
就不起作用了;同理,指定level=WARNING
後,debug
info
就不起作用了。logging
的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和檔案
(3)啟動Python的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態
(4)pdb.set_trace()
只需要import pdb
,然後在可能出錯的地方放一個pdb.set_trace()
,就可以設定一個斷點
(5)目前比較好的Python IDE有:
Visual Studio Code:https://code.visualstudio.com/
PyCharm:http://www.jetbrains.com/pycharm/
另外,Eclipse加上pydev外掛也可以除錯Python程式
3、單元測試
(1)寫單元測試需要引入Python自帶的unittest
模組
(2)測試類從unittest.TestCase
繼承,以test
開頭的方法就是測試方法,不以test
開頭的方法不被認為是測試方法,測試的時候不會被執行
(3)執行單元測試最簡單的方法是在指令碼檔案的最後加上兩行程式碼:
if __name__ == '__main__':
unittest.main()
另一種方法是在命令列通過引數-m unittest
直接執行單元測試
(4)可以在單元測試中編寫兩個特殊的setUp()
和tearDown()
方法,這兩個方法會分別在每呼叫一個測試方法的前後分別被執行
4、文件測試
(1)doctest非常有用,不但可以用來測試,還可以直接作為示例程式碼。通過某些文件生成工具,就可以自動把包含doctest的註釋提取出來。使用者看文件的時候,同時也看到了doctest