錯誤處理
python
有一套 try...except...finally...
來處理錯誤,相當於Java
的異常,finally
最終,都會執行
# 錯誤處理
try:
print('try...')
r = 10 / 0
print('result:', r)
except ZeroDivisionError as e:
print('except:', e)
finally:
print('finally...')
print('END')
def foo(s):
n = int(s)
if n==0:
raise ValueError('invalid value: %s' % s)
return 10 / n
def bar():
try:
foo('0')
except ValueError as e:
print('ValueError!')
raise #這種是拋出原異常
調試
日誌打印
- 使用
print
打印變量信息 - 使用
assert
,增加安全判斷 - 使用
logging
,輸出錯誤到文件 python -O err.py
關閉斷言assert
logging
的另一個好處是通過簡單的配置,一條語句可以同時輸出到不同的地方,比如console
和文件。
import logging
def foo(s):
n = int(s)
assert n != 0, 'n is zero!' #當前麪條件不成立時,拋出錯誤信息
return 10 / n
#設置logging等級
logging.basicConfig(level=logging.INFO)
pdb
單步調試:
python -m pdb xxx.py
進入pdb
在pdb
環境中,
n
下一步
p s
打印變量值s
指定位置調試:
在文件中加, pdb.set_trace()
程序會自動在pdb.set_trace()
暫停並進入pdb
調試環境,可以用命令p
查看變量,或者用命令c
繼續運行
單元測試
- 需要引入
unittest
模塊。測試類,從unittest.TestCase
繼承 - 測試方法,要以
test
開頭 - 幾個斷言方法。
self.assertEqual(abs(-1), 1) # 斷言函數返回的結果與1相等
self.assertTrue(isinstance(d, dict)) #斷言結果爲true
with self.assertRaises(KeyError): #斷言拋出錯誤
value = d['empty']
# 運行單元測試
# 方法一:
if __name__ == '__main__':
unittest.main()
# 方法二:
python -m unittest mydict_test