再一次重新學習Python——錯誤、除錯和測試
阿新 • • 發佈:2018-12-27
-
錯誤
一種用try...except...finally捕獲錯誤並用raise丟擲
-
除錯
assert 斷言
凡是用print
來輔助檢視的地方,都可以用斷言(assert)來替代:
# err.py
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
foo('0')
assert
的意思是,表示式n != 0
應該是True
,否則,後面的程式碼就會出錯。
如果斷言失敗,assert
語句本身就會丟擲AssertionError
$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!
logging
把print
替換為logging
是第3種方式,和assert
比,logging
不會丟擲錯誤,而且可以輸出到檔案:
# err.py
import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n
logging.info()
就可以輸出一段文字。執行,發現除了ZeroDivisionError
,沒有任何資訊。怎麼回事?
別急,在import logging
之後新增一行配置再試試:
import logging
logging.basicConfig(level=logging.INFO)
看到輸出了:
$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
File "err.py", line 8, in <module>
print 10 / n
ZeroDivisionError: integer division or modulo by zero
這就是logging
的好處,它允許你指定記錄資訊的級別,有debug
info
,warning
,error
等幾個級別,當我們指定level=INFO
時,logging.debug
就不起作用了。同理,指定level=WARNING
後,debug
和info
就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。
logging
的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和檔案
-
pdb
啟動Python的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態。
pdb.set_trace()
這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb
,然後,在可能出錯的地方放一個pdb.set_trace()
,就可以設定一個斷點: