錯誤 除錯和測試

2021-08-30 09:10:49 字數 3728 閱讀 1391

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語句塊,至此,執行完畢。出錯的時候,一定要分析錯誤的呼叫棧資訊,才能定位錯...