錯(cuò)誤處理
# coding=utf-8
import logging
try:
print 1 / 0
# print 1 / int('a')
# print 1 / 2
except ZeroDivisionError, e:
logging.exception(e) # 記錄錯(cuò)誤
print "exception:", e
except ValueError, e:
print "exception:", e
raise SystemError('input error!') # 將錯(cuò)誤轉(zhuǎn)為另一種錯(cuò)誤拋出
except Exception, e:
print type(e)
raise # 將錯(cuò)誤原樣拋出
else: # 沒有錯(cuò)誤時(shí)執(zhí)行
print "no error"
finally:
print "finally"
常見的錯(cuò)誤類型和繼承關(guān)系看這里:
https://docs.python.org/2/library/exceptions.html#exception-hierarchy
調(diào)試
- 使用print
- 斷言
assert n != 0, 'n is zero!' # 表達(dá)式不為 True 拋出 AssertionError ,附帶后面的信息
- logging
import logging
logging.basicConfig(level=logging.NOTSET)
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n
logging有debug,info茂附,warning舒岸,error...等多個(gè)級別,級別定高了低級別的信息就不會(huì)輸出,可以輸出到console或是文件等
- pdb
python -m pdb err.py
進(jìn)入調(diào)試模式骤竹,l 查看代碼帝牡,n 單步執(zhí)行,p 變量名
查看變量蒙揣,q 結(jié)束調(diào)試
- pdb.set_trace()
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 運(yùn)行到這里會(huì)自動(dòng)暫停
print 10 / n
運(yùn)行代碼靶溜,程序會(huì)自動(dòng)在pdb.set_trace()暫停并進(jìn)入pdb調(diào)試環(huán)境,可以用命令p查看變量懒震,或者用命令c繼續(xù)運(yùn)行
單元測試
- “測試驅(qū)動(dòng)開發(fā)”(TDD:Test-Driven Development)
- 編寫單元測試時(shí)罩息,我們需要編寫一個(gè)測試類,從unittest.TestCase繼承个扰。
- 以test開頭的方法就是測試方法扣汪,不以test開頭的方法不被認(rèn)為是測試方法,測試的時(shí)候不會(huì)被執(zhí)行锨匆。
-
assertEquals()
:
self.assertEquals(abs(-1), 1) # 斷言函數(shù)返回的結(jié)果與1相等
- 另一種重要的斷言就是期待拋出指定類型的Error,比如通過d['empty']訪問不存在的key時(shí)崭别,斷言會(huì)拋出
KeyError
:
with self.assertRaises(KeyError):
value = d['empty']
- 運(yùn)行單元測試
(1)最簡單的運(yùn)行方式是在mydict_test.py
的最后加上兩行代碼:
if __name__ == '__main__':
unittest.main()
將測試當(dāng)做腳本運(yùn)行
(2)在命令行通過參數(shù)-m unittest
運(yùn)行
- setUp與tearDown
這兩個(gè)方法會(huì)分別在每調(diào)用一個(gè)測試方法的前后分別被執(zhí)行】致啵可以進(jìn)行一些資源打開與關(guān)閉的操作
文檔測試
直接運(yùn)行文檔中的示例代碼茅主。文檔注釋一般在函數(shù)定義語句、類定義語句下一行開始土榴,使用多行字符串的語法:
def abs(n):
"""
注釋內(nèi)容
"""
模塊中文檔測試代碼:
if __name__ == "__main__":
import doctest
doctest.testmod()