try …except…finally
try:
print('測試開始')
m=10/0 #製造乙個錯誤
print('未出現錯誤') #若有錯誤,跳過此局
#出現錯誤跳到except語句
except zerodivisionerror as e: #except捕獲到zerodivisionerror然後執行
print('有錯誤')
except valueerror as e: #不同的錯誤型別
print('錯誤')
#沒有錯誤是執行else語句
else:
print('沒事')
#finally語句會執行
finally:
print('結束')
使用try…except捕獲錯誤還有乙個巨大的好處,就是可以跨越多層呼叫,比如函式main()呼叫foo(),foo()呼叫bar(),結果bar()出錯了,這時,只要main()捕獲到了,就可以處理:
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except exception as e:
print('error:', e)
finally:
print('finally...')
使用logging模組
# err_logging.py
import logging
def foo(s):
return 10 / int(s)
def bar(s):
return foo(s) * 2
def main():
try:
bar('0')
except exception as e:
logging.exception(e) #logging方法使用 logging.exception
main()
print('end')
用raise
斷言(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。可以用-0引數來關閉assert。
logging
允許你指定記錄資訊的級別,有debug,info,warning,error等幾個級別,當我們指定level=info時,logging.debug就不起作用了。同理,指定level=warning後,debug和info就不起作用了。這樣一來,你可以放心地輸出不同級別的資訊,也不用刪除,最後統一控制輸出哪個級別的資訊。
import unittest
from mydict import dict
class testdict(unittest.testcase):
def test_init(self):
d = dict(a=1, b='test')
self.assertequal(d.a, 1)
self.assertequal(d.b, 'test')
self.asserttrue(isinstance(d, dict))
def test_key(self):
d = dict()
d['key'] = 'value'
self.assertequal(d.key, 'value')
def test_attr(self):
d = dict()
d.key = 'value'
self.asserttrue('key' in d)
self.assertequal(d['key'], 'value')
def test_keyerror(self):
d = dict()
with self.assertraises(keyerror):
value = d['empty']
def test_attrerror(self):
d = dict()
with self.assertraises(attributeerror):
value = d.empty
if __name__ == '__main__':
unittest.main()
編寫單元測試時,我們需要編寫乙個測試類,從unittest.testcase繼承。以test開頭的方法就是測試方法,不以test開頭的方法不被認為是測試方法,測試的時候不會被執行。對每一類測試都需要編寫乙個test_***()方法。由於unittest.testcase提供了很多內建的條件判斷,我們只需要呼叫這些方法就可以斷言輸出是否是我們所期望的。最常用的斷言就是assertequal():
另一種重要的斷言就是期待丟擲指定型別的error,比如通過d[『empty』]訪問不存在的key時,斷言會丟擲keyerror:
而通過d.empty訪問不存在的key時,我們期待丟擲attributeerror:
在注釋中執行,
# mydict2.py
class dict(dict):
'''****** dict but also support access as x.y style.
>>> d1 = dict()
>>> d1['x'] = 100
>>> d1.x
100>>> d1.y = 200
>>> d1['y']
200>>> d2 = dict(a=1, b=2, c='3')
>>> d2.c
'3'>>> d2['empty']
traceback (most recent call last):
...keyerror: 'empty'
>>> d2.empty
traceback (most recent call last):
...attributeerror: 'dict' object has no attribute 'empty'
'''def __init__(self, **kw):
super(dict, self).__init__(**kw)
def __getattr__(self, key):
try:
return self[key]
except keyerror:
raise attributeerror(r"'dict' object has no attribute '%s'" % key)
def __setattr__(self, key, value):
self[key] = value
if __name__=='__main__':
import doctest
doctest.testmod()
錯誤 除錯和測試
在程式執行過程中,總會遇到各種各樣的錯誤。有的錯誤是程式編寫有問題造成的,比如本來應該輸出整數結果輸出了字串,這種錯誤我們通常稱之為bug,bug是必須修復的。有的錯誤是使用者輸入造成的,比如讓使用者輸入email位址,結果得到乙個空字串,這種錯誤可以通過檢查使用者輸入來做相應的處理。還有一類錯誤是...
錯誤 除錯和測試
如果發生錯誤,可以事先約定返回乙個錯誤 這樣就可以知道是否有錯以及原因。eg開啟檔案的函式open 成功時返回檔案描述符 就是乙個整數 出錯時返回 1.用錯誤碼來表示是否出錯十分不便。錯誤處理機制 try except finally try except x as e else finally 所...
python錯誤 除錯和測試
錯誤 除錯和測試 當我們認為某些 可能會出錯時,就可以用try來執行這段 如果執行出錯,則後續 不會繼續執行,而是直接跳轉至錯誤處理 即except語句塊,執行完except後,如果有finally語句塊,則執行finally語句塊,至此,執行完畢。出錯的時候,一定要分析錯誤的呼叫棧資訊,才能定位錯...