Python12月5日
阿新 • • 發佈:2020-12-08
錯誤、除錯和測試
錯誤處理
try
讓我們用一個例子來看看try
的機制:
try:
print('try...')
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
當我們認為某些程式碼可能會出錯時,就可以用try
來執行這段程式碼,如果執行出錯,則後續程式碼不會繼續執行,而是直接跳轉至錯誤處理程式碼,即except
語句塊,執行完except
後,如果有finally
finally
語句塊,至此,執行完畢。
上面的程式碼在計算10 / 0
時會產生一個除法運算錯誤:
從輸出可以看到,當錯誤發生時,後續語句print('result:', r)
不會被執行,except
由於捕獲到ZeroDivisionError
,因此被執行。最後,finally
語句被執行。然後,程式繼續按照流程往下走。
除錯
第一種方法簡單直接粗暴有效,就是用print()
把可能有問題的變數打印出來看看
用print()
最大的壞處是將來還得刪掉它,想想程式裡到處都是print()
,執行結果也會包含很多垃圾資訊
斷言
凡是用print()
來輔助檢視的地方,都可以用斷言(assert)來替代:
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!
程式中如果到處充斥著assert
,和print()
-O
引數來關閉assert
:
$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: division by zero
關閉後,你可以把所有的assert
語句當成pass
來看。
logging
把print()
替換為logging
是第3種方式,和assert
比,logging
不會丟擲錯誤,而且可以輸出到檔案
pdb
第4種方式是啟動Python的偵錯程式pdb,讓程式以單步方式執行,可以隨時檢視執行狀態。