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