1. 程式人生 > >再一次重新學習Python——錯誤、除錯和測試

再一次重新學習Python——錯誤、除錯和測試

  • 錯誤

一種用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

infowarningerror等幾個級別,當我們指定level=INFO時,logging.debug就不起作用了。同理,指定level=WARNING後,debuginfo就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。

logging的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console和檔案

  •  pdb

 啟動Python的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態。

pdb.set_trace()

這個方法也是用pdb,但是不需要單步執行,我們只需要import pdb,然後,在可能出錯的地方放一個pdb.set_trace(),就可以設定一個斷點: