python錯誤處理與調試

錯誤處理

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章