Python異常處理機制、除錯、測試

聽著music睡發表於2018-10-22

類似於Java的try..catch..finally

Java的為try_except_finally

try:
    print(`try...`)
    r = 10 / 0
    print(`result:`, r)
except ZeroDivisionError as e:
    print(`except:`, e)
finally:
    print(`finally...`)
print(`END`)

try執行一段可能會傳送異常的程式碼,如果有異常情況傳送 走except , 如果沒有則不走,最後不管程式碼有沒有傳送異常,都會執行finally裡的程式碼

異常錯誤存在父子類問題,如果父類處理了,子類則不會再接收處理

 

—————————————————————————————————————————————————————–

 

除錯

1、列印print

最簡單的就是print 把資料列印出來再去找錯誤原因

問題在於會在程式碼中出現很多列印語句

2、斷言assert

 assert n != 0, `n is zero!`

assert的意思是,表示式n != 0應該是True,否則,根據程式執行的邏輯,後面的程式碼肯定會出錯。

如果斷言失敗,assert語句本身就會丟擲AssertionError

$ python err.py
Traceback (most recent call last):
  ...
AssertionError: n is zero!

 

注:

程式中如果到處充斥著assert,和print()相比也好不到哪去。不過,啟動Python直譯器時可以用-O引數來關閉assert

關閉後,你可以把所有的assert語句當成pass來看。

$ python -O err.py
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero

 

3、logging

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

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

import logging
logging.basicConfig(level=logging.INFO)

s = `0`
n = int(s)
logging.info(`n = %d` % n)
print(10 / n)

-------------------------------------------- $ python err.py INFO:root:n
= 0 Traceback (most recent call last): File "err.py", line 8, in <module> print(10 / n) ZeroDivisionError: division by zero

 

相關文章